预增量&增量后

时间:2014-10-15 01:41:37

标签: c undefined-behavior post-increment pre-increment

今天我重新审视了Pre Increment和Post Increment。

我知道的基本定义。

预增量 - 增加值并返回值。

后期增量 - 增加值并在增量前返回值。

但是做一些他们的组合我很难过。

使用基本的C程序,这是我测试的。

最初i = 0。

第一次测试

printf("%d %d",++i,++i);

输出继电器:

2 2

我期待:

1 2

第二次测试

printf("%d %d",i++,i++);

输出继电器:

1 0

我期待:

0 1

第三次测试

printf("%d %d",i++,++i);

输出继电器:

1 2

我期待:

0 2

第四次测试

printf("%d %d",++i,i++);

输出继电器:

2 0

我期待:

1 1

我认为评估可能来自右侧或左侧。也许是从Pre Increment&正好在Post增量的情况下。也许Pre Increment的优先级高于Post增量。一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出。

1 个答案:

答案 0 :(得分:6)

您拥有的所有内容都是未定义的行为,因为您在同一对序列点之间多次修改同一个变量。例如

i = i++;

也是未定义的。有一个更深入的讨论here,并且有一个很好的slideshare涵盖了这个和更多“深C”的怪癖。

另一个问题是评估顺序。参数以未指定的顺序进行评估,因此如果您有

f(a(), b(), c());

它可以按任意顺序调用abc

你正在混合未定义的行为和未指明的行为,所以尽管你可以冒昧地猜测为什么你得到你的输出,但很难给出令人满意的解释,因为它是如此随机。