0

我今天遇到了一个巫术。

http://codepad.org/VW2vTpWw

语言:C

代码:

#include <stdio.h>

main()
{
    int i = 5;
    i = i++;
    printf ("%i", i);
}

输出:

6

如何?为什么?

这应该是棘手的代码,但反过来。粗心的程序员会认为这i = i++只是简单的增量,但事实并非如此。然而它在这里像一个一样工作。它应该是5!就像在JavaScript中一样。

应该发生什么。

  1. i得到 的值5
  2. i++返回5
  3. i后递增i++(to 6)。
  4. i获取5(由 )返回的值i++
  5. i( )的值5被打印出来。

然而它是6

我无法在 SO 或整个互联网上找到对此的描述(正好相反)。

这里有什么问题?

请解释。

4

1 回答 1

11

在没有中间序列点的情况下将多次存储到对象是未定义的行为。

特别是,您的第 3 步和第 4 步没有定义的顺序,增量(和存储)或存储可能首先发生。

于 2013-05-12T20:01:10.837 回答