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

标签 c gcc

我正在制定另一个问题的答案,并遇到了解释 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/

相关文章:

c - 通过子访问父

c - 将数据文件读入二维数组后出现段错误

c - -fomit-frame-pointer *总是*省略 fp 吗?

linux - 如何使用 autotools、make 和 gcc 在 64 位 (Ubuntu 12.04LTS) Linux 上编译和安装 32 位库?

c - 堆栈的 Pop 函数出现意外行为

c++ - C for 循环的实现方式与其他语言不同?

c - 使用 GDB : Program dies after SIGILL, 非法指令进行远程调试

c++ - C++:为什么这可以加快我的代码的速度?

c++ - C 执行期间记录错误

c - 交换函数返回数组