C、前后自增,不同程序答案不同

标签 c post-increment pre-increment

<分区>

学习C语言时测试一些代码,

#include <stdio.h>
#include <math.h>
#define hypotenusa(x, y)  sqrt((x) * (x) + (y) * (y))

int main(void) {
    int a, x;
    x = 2;
    a = hypotenusa(++x, ++x);
    printf("%d\n", a);
}

我得到了答案

  • 6 在一个程序中(dosbox gcc 编译器)
  • 7 在 codelight gcc 编译器和
  • 8 在 codeChef 在线编译器上

谁能解释一下这种行为? 我的逻辑说它应该是 6 (sqrt(42)) 但是...

最佳答案

undefined behaviour .

宏替换后

a = hypotenusa(++x, ++x);

变成:

a = sqrt((++x) * (++x) + (++x) * (++x));

如您所见,x 被多次修改,没有任何中间序列点。参见 What Every C Programmer Should Know About Undefined Behavior .

关于C、前后自增,不同程序答案不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365876/

相关文章:

c - C中的段错误

c - 为什么异或 c 中的字符串给我垃圾值?

javascript - Javascript 中的预增量

c - 具有逻辑运算符的混合增量运算符

c - 为什么这个使用移位的交换宏不适用于负数?

c - 为什么 strcmp() 在其输入相等时返回 0?

c - Arduino C 随机 LED 代码未打开所有 LED

c++ - 运算符优先级.. () 和++

c - 递增运算符在 if 语句中如何工作?

c# - 为什么++运算符重载时++foo和foo++没有区别?