正如这个问题中所述:LLVM和GCC,不同输出相同的代码 https://stackoverflow.com/questions/15929795/llvm-and-gcc-different-output-same-code、LLVM 和 GCC 会导致同一代码产生不同的输出。
#include <stdio.h>
#define MAX(a,b) ( (a) > (b) ? (a) : (b) )
int increment() {
static int i = 42;
i += 5;
printf("increment returns %d\n",i);
return i;
}
int main( int argc, char ** argv ) {
int x = 50;
printf("max of %d and %d is %d\n", x,increment(),MAX(x, increment()));
printf("max of %d and %d is %d\n", x,increment(),MAX(x, increment()));
return 0;
}
LLVM 输出给出:
increment returns 47
increment returns 52
increment returns 57
max of 50 and 47 is 57
increment returns 62
increment returns 67
increment returns 72
max of 50 and 62 is 72
而 GCC 输出给出:
increment returns 47
increment returns 52
max of 50 and 52 is 50
increment returns 57
increment returns 62
increment returns 67
max of 50 and 67 is 62
现在,在另一个问题中,有人回答说未指定参数的评估顺序,这就是行为未指定的原因。但是,如果您非常仔细地浏览代码,您会发现实际上计算的顺序是指定的。 GCC 编译器正在评估x,increment(),MAX(x, increment())
来自printf()
方法从右到左,而 LLVM 编译器从左到右评估此代码。有谁知道为什么会这样?不应该像评估顺序一样printf
定义明确并且对于两个编译器都是相同的?
另外,我只是想澄清一下,这段代码来自教程,旨在理解 C 语言是如何工作的。它的目的不是成为一个正常运行的程序或产生准确的输出。古怪的输出是故意的,并且使用像代码中使用的愚蠢宏(MAX)也是故意的。我只是想了解为什么这里有这么大的差异,谢谢!