هذا هو وسيلة جيدة للقيام strcmp للعودة كاذبة عندما سلاسل فارغة
سؤال
وأريد شرط آخر --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()
على الحروف اختلاف الأولى. إذا كان كل من سلاسل فارغة، وراضيا عن طريق بك "حالة خاصة" أعلاه، وسيتم التعامل مع هذا فقط في أسرع وقت المثال كنت قد أعطيت.
وبإضافة معالج خاص لكل من السلاسل الفارغة على النحو الوارد أعلاه، قمت بها فقط الحالات التي لم تكن كذلك، أبطأ تبعا لذلك.