繁体   English   中英

后增量运算符是否保证立即运行?

[英]Is post-increment operator guaranteed to run instantly?

假设我有以下代码:

int i = 0;
func(i++, i++);

返回值后立即发生增量? 是否保证第一个参数为 0,第二个参数为 1?

这段代码被破坏有两个原因:

  • 在序列点之间访问变量两次,用于确定要存储的值以外的其他目的,是未定义的行为。 函数参数的评估之间没有序列点。 这意味着任何事情都可能发生,您的程序可能会崩溃和烧毁(或者更有可能显示不正确或垃圾值)。
  • 函数参数的求值顺序是未指定的行为,这意味着您无法知道哪个将首先求值。

未定义的行为和序列点

为什么这些构造(使用 ++)是未定义的行为?

不,你的代码是错误的。 函数参数的求值之间没有序列点,两个对同一个对象有副作用的操作只有在它们被序列点分隔时才被允许。

C 中不存在“立即运行”的概念。最接近的可能是顺序操作的想法,其中上述顺序点强制分隔两个语句或表达式的执行。

是否保证第一个参数为 0,第二个参数为 1?

不。它的未定义行为。 不能保证函数参数的求值顺序是从左到右或从右到左,即求值顺序是未指定的,因此对i副作用是无序的。

C11:6.5 表达式 (p2)

如果相对于对同一标量对象的不同副作用或使用同一标量对象的值进行的值计算,标量对象的副作用是未排序的,则行为未定义 [...]

当您编写i++ ,您要求发生件事:

  1. 获取i的值并加一
  2. 将结果存回i

现在,您必须了解的是,尽管 #1 会立即发生,但#2 不会 考虑#2 的正确方式是它发生在“稍后”。 这就是为什么我们不能说func(i++, i++); 做。 我们无法知道i++的一个是在第二个i++发生之前还是之后将其结果存储回i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM