2

这是一个示例代码,只是为了显示 LLVM 编译器和 GCC 的不同输出。我想知道为什么?答案应该很简单,但我看不到。(Xcode 4.6.1)

编码:

#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

海合会输出:

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
4

2 回答 2

13

未指定参数的评估顺序。所以这:

printf("max of %d and %d is %d\n", x,increment(),MAX(x, increment()));

导致未定义的未指定行为。这就是为什么你在两个编译器上都有不同的结果。

另一个(潜在)问题是:MAX- 它可能导致两次调用increment. 避免使用此类宏。

于 2013-04-10T15:14:45.173 回答
-2

LLVM 代码根据 ANSI C 生成正确的结果。如果您不希望在每个打印语句中多次调用增量,请将返回值保存在变量中并使用它。精神上单步执行代码,显示应该是增量返回 47 增量返回 52 增量返回 57 最大值为 50 和 47 是 57 增量返回 62 增量返回 67 最大值为 50 和 62 是 72 所以我最初的反应和对代码的研究是错误的,并且 LLVM 输出是正确的。LLVM 结果的原因是 main 中的每个打印语句都调用了 3 次增量。使此代码打印合理输出的方法是将增量返回的值保存在变量中并打印该变量,而不是再次调用增量。据我所知,结果的差异并不取决于未定义的行为,

于 2014-05-25T14:09:50.107 回答