今天我重新审视了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增量。一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出。
答案 0 :(得分:6)
您拥有的所有内容都是未定义的行为,因为您在同一对序列点之间多次修改同一个变量。例如
i = i++;
也是未定义的。有一个更深入的讨论here,并且有一个很好的slideshare涵盖了这个和更多“深C”的怪癖。
另一个问题是评估顺序。参数以未指定的顺序进行评估,因此如果您有
f(a(), b(), c());
它可以按任意顺序调用a
,b
和c
。
你正在混合未定义的行为和未指明的行为,所以尽管你可以冒昧地猜测为什么你得到你的输出,但很难给出令人满意的解释,因为它是如此随机。