在while循环中,最后一个逗号分隔语句是否保证最后运行?

时间:2010-11-01 19:57:00

标签: c++ specifications language-specifications

考虑以下(普通)代码段:

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

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

3 个答案:

答案 0 :(得分:16)

  

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

如果你在引用函数参数之间的逗号,那只是一个分隔符。

在你的情况下,你正在使用逗号运算符,它引入了一个序列点,它保证逗号左操作数的所有副作用在评估正确的操作数之前已经稳定下来。 / p>

是的,它定义明确。

从ISO C ++ 98标准的第5.18 / 1节开始:

  

用逗号分隔的一对表达式从左到右计算,左表达式的值被丢弃。左值(左值)至右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换不应用于左表达式。除了对临时表的破坏(12.2)之外,左表达的所有副作用(1.9)在评估正确表达之前进行。类型和   结果的值是右操作数的类型和值;如果右操作数为。

,则结果为左值

答案 1 :(得分:11)

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

答案 2 :(得分:3)

以上评论解释了这一点。 滥用这种方法的常见方法之一是

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

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