0

以下异常的任何原因?

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

然后执行,得到结果:

数量:0

如果使用 Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86 编译

cl PstFixInc.c

然后执行,得到结果:

数量:1

4

3 回答 3

4

这是未定义的行为。

您在没有交错序列点的情况下两次分配给同一个变量。

于 2014-07-24T17:46:19.333 回答
4

您所拥有的是未定义的行为,您正在修改num并使用其先前的值,而不是确定要存储在同一序列点内的值。这在草案 C99 标准部分6.5第 2 段中有所介绍,其中说:

在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。72)此外,先前的值应只读以确定要存储的值。73)

还有两个未定义行为的示例:

i = ++i + 1;
a[i++] = i;

第一个与您的示例非常相似。使用clangeven 会给你一个很好的警告:

 warning: multiple unsequenced modifications to 'num' [-Wunsequenced]
  num = (num++) % 4;
  ~     ^
于 2014-07-24T17:46:49.070 回答
0

这一行:

num = (num++) % 4;

根据 C 标准是未定义的行为。代码产生的任何结果都是“正确的”。

于 2014-07-24T17:46:48.663 回答