预增量和后增量

Sha*_*uri -1 c undefined-behavior pre-increment post-increment

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

我知道的基本定义.

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

后递增 - 递增值并在递增之前返回值.

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

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

最初i = 0.

第一次测试

printf("%d %d",++i,++i);
Run Code Online (Sandbox Code Playgroud)

输出继电器:

2 2
Run Code Online (Sandbox Code Playgroud)

我期望:

1 2
Run Code Online (Sandbox Code Playgroud)

第二次测试

printf("%d %d",i++,i++);
Run Code Online (Sandbox Code Playgroud)

输出继电器:

1 0
Run Code Online (Sandbox Code Playgroud)

我期望:

0 1
Run Code Online (Sandbox Code Playgroud)

第三次测试

printf("%d %d",i++,++i);
Run Code Online (Sandbox Code Playgroud)

输出继电器:

1 2
Run Code Online (Sandbox Code Playgroud)

我期望:

0 2
Run Code Online (Sandbox Code Playgroud)

第四次测试

printf("%d %d",++i,i++);
Run Code Online (Sandbox Code Playgroud)

输出继电器:

2 0
Run Code Online (Sandbox Code Playgroud)

我期望:

1 1
Run Code Online (Sandbox Code Playgroud)

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

Rya*_*ing 6

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

i = i++;
Run Code Online (Sandbox Code Playgroud)

也是未定义的.有一个更深入的讨论在这里,有一个不错的SlideShare上覆盖此更"深C"怪癖.

另一个问题是评估顺序.参数以未指定的顺序进行评估,如果有的话

f(a(), b(), c());
Run Code Online (Sandbox Code Playgroud)

它可以调用a,b以及c以任何顺序.

你正在混合未定义的行为和未指定的行为,所以尽管你可以冒险猜测你为什么得到你所做的输出,但由于它是随机的,所以很难给出令人满意的解释.