我刚刚创建了一个简单的函数,它返回输入的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,对吧?
答案 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;
}
}