هذا هو وسيلة جيدة للقيام strcmp للعودة كاذبة عندما سلاسل فارغة

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

سؤال

وأريد شرط آخر --still الحفاظ على وقت التنفيذ بسرعة ولكن على أكثر أمانا - يمكنك حيث أعود كاذبة إذا كان أحد أو كلا سلاسل فارغة:

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
هل كانت مفيدة؟

المحلول

لا، هذا ليس وسيلة جيدة للقيام بذلك، لأنه لا يعمل.

if(*str1==*str2 =='\0')

وسوف تحصل على تقييم ما يلي:

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

وبعبارة أخرى، لأن منطقي والحصول على ترقية إلى عدد صحيح، الاختبار سيعود صحيح كلما تبدأ السلاسل مع شخصيات مختلفة (لن tmp1 تكون كاذبة، الذي يحصل على تحويلها إلى 0، وهكذا يصبح tmp2 صحيح)

لا تحاول اغلب مترجم. كتابة التعليمات البرمجية سريع ليس حول كتابة الأسطر القليلة اعتبارا من التعليمات البرمجية كما خطوط الممكنة، أو حتى قصيرة قدر الإمكان. حتى لو تسلسل معا == بهذه الطريقة كان معنى، وليس هناك سبب لماذا تريد ان تكون أسرع. مجرد كتابة التعليمات البرمجية التي تفهم، ويمكن أن يكتب بشكل صحيح.

نصائح أخرى

وحتى إذا قمت بتطبيق الاختبارات في وقت مبكر المغادرة يوحي لك بشكل صحيح، وأنت من المستبعد جدا لجعل الامور أي أسرع من خلال ذلك النوع من الشيء - وبالفعل strcmp أن تفعل هذا أو ما يقرب من هذا

وهنا هو رمز للstrcmp():

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

وانها بالفعل بأسرع ما يمكن أن يكون مفيد. الاختيار دخيلة الخاص بك يجعل فقط الحالات التي لا تهتم بها، أبطأ.

if( *str1 == 0 || *str2 == 0 )
   return 0;

والمثال كنت قد أعطيت لن حتى يعمل بشكل صحيح. سوف تتوقف strcmp() على الحروف اختلاف الأولى. إذا كان كل من سلاسل فارغة، وراضيا عن طريق بك "حالة خاصة" أعلاه، وسيتم التعامل مع هذا فقط في أسرع وقت المثال كنت قد أعطيت.

وبإضافة معالج خاص لكل من السلاسل الفارغة على النحو الوارد أعلاه، قمت بها فقط الحالات التي لم تكن كذلك، أبطأ تبعا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top