为什么这两个表达式的结果不同?

Jon*_*ler 3 c gcc

我正在开发另一个问题的答案,并遇到了一个砖墙,解释了GCC在特定表达式上计算的结果.(我的回答与inline函数有关;最初代码由两个源文件和一个头文件组成.我将它们连接成一个源文件,而不是使用inline.)

//static inline int somename(int x, int y) { return x + y + 1; }
static int somename(int x, int y) { return x + y + 1; }
extern int nothername(int x, int y);

#include <stdio.h>

int main(void)
{
    printf("somename(1,2)   = %d\n", somename(1, 2));
    printf("nothername(2,1) = %d\n", nothername(2, 1));
    return 0;
}

int nothername(int x, int y)
{
    printf("x = %d, y = %d, somename(x, y) = %d, cn = %d\n",
           x, y, somename(x, y),  ((y != 0) ? x / y : x));
    int z1 = somename(x, y) +  (y != 0) ? x / y : x;
    int z2 = somename(x, y) + ((y != 0) ? x / y : x);
    printf("z1 = %d, z2 = %d\n", z1, z2);
    return somename(x, y) + (y != 0) ? x / y : x;
}
Run Code Online (Sandbox Code Playgroud)

预期产出

somename(1,2)   = 4
x = 2, y = 1, somename(x, y) = 4, cn = 2
z1 = 6, z2 = 6
nothername(2,1) = 6
Run Code Online (Sandbox Code Playgroud)

实际输出

somename(1,2)   = 4
x = 2, y = 1, somename(x, y) = 4, cn = 2
z1 = 2, z2 = 6
nothername(2,1) = 2
Run Code Online (Sandbox Code Playgroud)

题:

  • 为什么z1不是6?

环境

这是在MacOS X 10.6.7上运行的.我使用Apple提供的GCC 4.2.1作为XCode 3的一部分; 我已经使用了我编译的GCC 4.6.0.最初的实验与inlineC++中的函数有关; 等效代码使用cout等产生相同的计算结果.我没有检查somename(2, 1),并somename(1, 2)都产生4.

dfa*_*fan 11

优先级?:非常低,所以

int z1 = somename(x, y) + (y != 0) ? x / y : x;
Run Code Online (Sandbox Code Playgroud)

被解释为

int z1 = (somename(x, y) + (y != 0)) ? (x / y) : (x);
Run Code Online (Sandbox Code Playgroud)

(4 + 1) ? (2 / 1) : 2是2,这是2.

这也解释了为什么在计算中添加括号来z2解决问题.