c - 预增量和后增量

标签 c undefined-behavior post-increment pre-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

我认为评估可能来自右侧或左侧。在前增量的情况下可能从左开始,在后增量的情况下可能从右开始。也许预增量的优先级高于后增量。一些与结果相匹配的想法,但对一个测试所做的假设并不能解释其他输出。

最佳答案

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

i = i++;

也是未定义的。有更深入的讨论here ,还有一个不错的 slideshare这涵盖了这个以及更多“深 C”怪癖。

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

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

它可以按任意顺序调用 abc

您混合了未定义的行为和未指定的行为,因此尽管您可以大胆猜测来解释为什么会得到这样的输出,但很难给出令人满意的解释,因为它是如此随机。

关于c - 预增量和后增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26373132/

相关文章:

c - 自午夜以来的纳秒

c - 错误 : Assignment to expression with array type in named pipes

c++ - 从 C++ 调用 C 程序并传递参数

c - while循环结束时n++和++n的区别? (美国标准 C)

java - a = (a++) * (a++) 在 Java 中给出奇怪的结果

c - 链表插入和删除

c++ - 在两个相似类之间使用 reinterpret_cast 时出现错误?

c++ - 用其他语言编写的函数是否受关于 UB 的 C++ 规则的约束?

c - 在无法到达的路径上具有未定义行为的程序的行为是否已定义?

c++ - 左值和右值分配错误