编译器优化返回值?

时间:2013-06-24 18:14:35

标签: c

我刚刚创建了一个简单的函数,它返回输入的char *的更长时间并将其打印到控制台。一旦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。 0,对吧?

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

return *s1 ? first : second;

答案 3 :(得分:0)

如果由于某种原因你需要牺牲易读性来减少分支条件:

char* longer(char* first, char* second) {
    char *s1 = first, *s2 = second;
    for ( ; ; ++s1, ++s2 )
       if(!*s2)
           return first;
       if(!*s1)
           return second;
    }
}