12

考虑以下(平凡的)代码段:

while (i++, i <= 10) {
  // some more code
}

在一般情况下,C++ 允许以任何顺序评估逗号分隔的语句。在 while 循环的情况下,我们是否至少保证(通过规范)最后一个语句(用作循环的条件)最后被评估?

4

3 回答 3

18

在一般情况下,C++ 允许以任何顺序评估逗号分隔的语句。

如果您指的是函数参数之间的逗号,那只是一个分隔符。

在您的情况下,您使用的是逗号运算符,它引入了一个序列点,该序列点保证逗号左侧操作数的所有副作用在评估右侧操作数之前已经解决。

所以是的,它是明确定义的。

来自 ISO C++98 标准的第 5.18/1 节:

一对用逗号分隔的表达式从左到右求值,左边表达式的值被丢弃。左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换不适用于左表达式。左侧表达式的所有副作用 (1.9),除了临时变量 (12.2) 的破坏,都在评估右侧表达式之前执行。结果的类型和值是右操作数的类型和值;如果它的右操作数是,则结果是一个左值。

于 2010-11-01T20:00:40.700 回答
11

是的。,运算符(除非重载!)引入了一个所谓的序列,并且确实保证了从左到右的执行顺序。

于 2010-11-01T19:59:54.413 回答
4

上面的评论解释了它。滥用这种方法的一种常见方式是

while(scanf("%d", &n), n){
    // do something
}

这将读取整数,直到我们读取零。

于 2014-02-22T20:58:02.833 回答