今天我重新回顾了前增量和后增量。
我知道的基本定义。
预递增 - 递增值并返回值。
后增量 - 增量值并返回增量之前的值。
但是将它们进行一些组合,我被难住了。
使用基本的 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
我认为评估可能来自右侧或左侧。在前增量的情况下可能从左开始,在后增量的情况下可能从右开始。也许预增量的优先级高于后增量。一些与结果相匹配的想法,但对一个测试所做的假设并不能解释其他输出。
最佳答案
您所拥有的一切都是未定义的行为,因为您在同一对序列点之间多次修改同一变量。例如
i = i++;
也是未定义的。有更深入的讨论here ,还有一个不错的 slideshare这涵盖了这个以及更多“深 C”怪癖。
另一个问题是评估的顺序。参数以未指定的顺序计算,因此如果您有
f(a(), b(), c());
它可以按任意顺序调用 a
、b
和 c
。
您混合了未定义的行为和未指定的行为,因此尽管您可以大胆猜测来解释为什么会得到这样的输出,但很难给出令人满意的解释,因为它是如此随机。
关于c - 预增量和后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26373132/