我是C语言的新手(所以我很有可能在做一些根本上是错的或坏的事情),并且正在研究kattis问题,https://open.kattis.com/problems/abc。
我正在尝试看似GCC优化器,并且试图了解为什么或做错了什么。这是我能想到的最简单的复制案例:
#include <stdio.h>
#include <string.h>
int lookup(char input){
// This will return 2 on invalid input. Not ideal, but we don't have to worry about invalid inputs like that
fprintf(stderr, "Asked to compare: %s\n", &input);
if (strcmp("A", &input) == 0){
//fprintf(stderr, "It's an A\n");
return 0;
} else if (strcmp("B", &input) == 0){
//fprintf(stderr, "It's a B\n");
return 1;
} else {
return 2;
};
}
int main(void){
char input[3];
if (scanf("%3s", input) != 1){
fprintf(stderr, "Something went wrong reading input\n");
return -1;
};
printf("Desired Order: %s\n", input);
printf("%d %d %d\n", lookup(input[0]),
lookup(input[1]),
lookup(input[2])
);
}
用于触发此错误的示例输入文件只有一行:
CAB
如果我没有优化就编译:
$ cc -std=gnu11 -static -lm simple.c -o simple && cat input | ./simple
Desired Order: CAB
Asked to compare: B
Asked to compare: A
Asked to compare: C
2 0 1
启用优化后,请注意它会进入else部分:
$ cc -O2 -std=gnu11 -static -lm simple.c -o simple && cat input | ./simple
Desired Order: CAB
Asked to compare: B
Asked to compare: A
Asked to compare: C
2 2 2
到目前为止我已经注意到的事情:
fprintf
之后取消对strcmp("A", &input)
的注释,即使启用了优化,代码也可以正常工作(这就是我想知道优化首先破坏代码的原因)。fprintf
之后取消注释strcmp("B", &input)
,则优化后代码将失败。printf
,则即使进行了优化,代码也可以正常工作。答案 0 :(得分:4)
char input[3];
但是您在其中写了三个字符。空终止符还需要1个。
char input[4];
这里有
fprintf(stderr, "Asked to compare: %s\n", &input);
不。那不是一个字符串,所以我们想要一个字符
fprintf(stderr, "Asked to compare: %c\n", input);
我们也有
strcmp("A", &input) == 0
但是输入是char
,所以我们想要
'A' == input
与“ B”相同