我正在开发另一个问题的答案,并遇到了解释 GCC 在特定表达式上计算的结果的砖墙。 (我的回答与 inline
函数有关;最初代码由两个源文件和一个 header 组成。我将它们连接成一个源文件,而不是使用 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;
}
预期输出
somename(1,2) = 4
x = 2, y = 1, somename(x, y) = 4, cn = 2
z1 = 6, z2 = 6
nothername(2,1) = 6
实际产量
somename(1,2) = 4
x = 2, y = 1, somename(x, y) = 4, cn = 2
z1 = 2, z2 = 6
nothername(2,1) = 2
问题:
z1
不是 6? 环境
这是在 MacOS X 10.6.7 上运行的。我使用了 Apple 提供的 GCC 4.2.1 作为 XCode 3 的一部分;我使用了我编译的 GCC 4.6.0。最初的实验与 C++ 中的
inline
函数有关;使用 cout
等的等效代码产生相同的计算结果。我确实检查过 somename(2, 1)
和 somename(1, 2)
都产生 4。 最佳答案
?:
的优先级很低,所以
int z1 = somename(x, y) + (y != 0) ? x / y : x;
被解释为
int z1 = (somename(x, y) + (y != 0)) ? (x / y) : (x);
这是
(4 + 1) ? (2 / 1) : 2
,即 2。这也解释了为什么在
z2
的计算中添加括号可以解决问题。关于c - 为什么这两个表达式的结果不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5694234/