#include <iostream>
int main() {
if(1 == 2, true) {
std::cout << "right" << std::endl;
} else std::cout << "left" << std::endl;
return 0;
}
它输出'正确',它总是如此吗?
编译器是否可以优化左操作数,因为它没有使用?
warning: left operand of comma operator has no effect [-Wunused-value]
if(1 == 2, true) {
~~^~~~
我有一些像这样的代码:
if(doSomethingHereWhichAlwaysReturnsTrue,
doSomeOtherHereAndDependOnTheResultExecuteBodyOrNot) {
..body.. - execute if 'doSomeOther' returns true
}
通过这段代码只是调试,我想我可以在发布中使用这样的结构。我猜没有。
不要问两次,我也会使用有时分配链接:
int i, j, k, l;
i = j = k = l = 0;
安全吗?
我曾经听说过执行顺序是未定义的,所以这是一个未定义的行为。而作为UB,它可以被编译器清楚地优化,但是使用' -O3 -Wall -pedantic '我看不到它的警告,以及预期的结果,所以我猜有没有这里有问题。
答案 0 :(得分:2)
C ++标准5.18说
用逗号分隔的一对表达式从左到右进行评估; 左表达式是一个abandonedvalue表达式(第5条).86 Every 值计算和与左表达式相关的副作用 在每个值计算和副作用相关之前进行排序 用正确的表达方式。结果的类型和值是 右操作数的类型和值;结果具有相同的值 category作为右操作数,如果是右操作数则是一个位字段 是一个glvalue和一个位域。如果右操作数的值是a 临时(12.2),结果是暂时的。
所以是的,根据标准,返回第二个操作数的值是预期的行为。
然而,you can overload comma operator,在这种情况下,它可以返回您想要的任何内容。
答案 1 :(得分:0)
不完全。对于诸如int double之类的基类型,它是正确的。 对于我们的课程,我们可以覆盖,运算符并决定运算符返回的内容。 在boost lib中有一个很好的例子,该函数是关于向量的插入。