我刚刚做了一个简单的函数,它返回输入的较长的 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,对吧?