Microsoft C偏离标准

时间:2014-07-24 17:44:04

标签: c gcc visual-studio-2013 undefined-behavior sequence-points

出现以下失常的原因是什么?

考虑以下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

3 个答案:

答案 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标准的未定义行为。代码产生的任何结果都是“正确的”。

相关问题