考虑以下(微不足道的)代码段:

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

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

有帮助吗?

解决方案

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

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

在您的情况下,您正在使用 逗号操作员, ,这引入了一个序列,该序列确保了逗号左操作数的所有副作用在评估右侧的操作。

是的,它是明确的。

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

一对由逗号分隔的表达式被评估为从左到右,左表达式的值被丢弃。 LVALUE-to-rvalue(4.1),阵列到二重奏(4.2)和功能对二重奏(4.3)标准转换未应用于左表达式。在评估正确表达式之前,进行了左表达式的所有副作用(1.9),除了临时(12.2)的破坏(12.2)。结果的类型和值是正确操作数的类型和值;结果是如果其正确的操作数为lvalue。

其他提示

是的。这 , 操作员(除非超载!)引入了所谓的 序列 确实保证了从左到右执行的顺序。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top