出现以下失常的原因是什么?
考虑以下C程序(名为PstFixInc.c)
#include <stdio.h>
int main (int argc, char *argv [])
{
int num = 0;
num = (num++) % 4;
printf ("num: %d\n",num);
return 0;
}
如果使用gcc 4.8.1
编译:
gcc -o PstFix.exe PstFixInc.c
然后执行,你得到结果:
num:0
如果使用Microsoft(R)C / C ++优化编译器版本18.00.21005.1 for x86编译
cl PstFixInc.c
然后执行,你得到结果:
num:1
答案 0 :(得分:4)
您在没有交错sequence point的情况下两次分配同一个变量。
答案 1 :(得分:4)
您所拥有的是未定义的行为,您正在修改num
并使用其先前的值而不是确定要存储在同一序列点中的值。 C99标准部分6.5
第2段草案中对此进行了说明:
在上一个和下一个序列点之间,一个对象的存储值最多只能通过a的评估修改一次 表达式.72)此外,先验值只能读取 确定要存储的值.73)
还有两个未定义行为的例子:
i = ++i + 1;
a[i++] = i;
第一个与你的例子很相似。
使用clang
甚至会给你一个很好的警告:
warning: multiple unsequenced modifications to 'num' [-Wunsequenced]
num = (num++) % 4;
~ ^
答案 2 :(得分:0)
这一行:
num = (num++) % 4;
是根据C标准的未定义行为。代码产生的任何结果都是“正确的”。