0

我刚刚做了一个简单的函数,它返回输入的较长的 char*s 并将其打印到控制台。一旦两个 char*s 相等,我预计会出现某种形式的分段错误,但它每次都会将第二个 char* 打印到控制台。这是编译器优化的一种形式还是我遗漏了什么?

样本输入:./longer test test将输出第二个“测试”(argv[2])。

出于好奇尝试了clang和gcc,结果相同。

#include<stdio.h>

char* longer(char *, char *);

int main(int argc, char *argv[]) {
    printf("%s", longer(argv[1], argv[2]));
    return 0;
}

char* longer(char* s1, char* s2) {
    char *first, *second;
    for(first = s1, second = s2; *s1 && *s2; s1++, s2++);
    return *s1 > *s2 ? first : second;
}

为澄清起见,由于循环在空字节处中断,较长的函数是比较当前位置的 ascii 值。本质上,比较将是 0 > 0,对吧?

4

4 回答 4

0

If for some reason you need to sacrifice legibility for the reduction of branch conditions:

char* longer(char* first, char* second) {
    char *s1 = first, *s2 = second;
    for ( ; ; ++s1, ++s2 )
       if(!*s2)
           return first;
       if(!*s1)
           return second;
    }
}
于 2013-06-24T18:37:58.383 回答
0

0 > 0是假的。(这是有道理的。零不大于零)。

因为它是假的,所以返回第二个字符串,因为这就是你的三元运算符所说的,只要条件为假就返回。

于 2013-06-24T18:19:46.800 回答
0

它必须返回一些东西。所以它将基于“真”或“假”返回。如果 s1 不大于 s2,则返回 false。在这种情况下,它是字符串“秒”。

于 2013-06-24T18:26:27.803 回答
0

return *s1 > *s2 ? first : second;如果您的系统使用有符号字符,并且您输入的字符串包含超过 0x7F 的字符,则条件也可能会失败。更好更简单的是:

return *s1 ? first : second;
于 2013-06-24T18:29:57.507 回答