operator ',' 总是 returns 第二个参数吗?
Does operator ',' always returns the second argument?
#include <iostream>
int main() {
if(1 == 2, true) {
std::cout << "right" << std::endl;
} else std::cout << "left" << std::endl;
return 0;
}
它输出'right',总是这样吗?
编译器是否可以只优化左边的操作数,因为它没有被使用?
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' 我看不到任何警告和预期结果,所以我猜那里 这里没有问题。
C++ 标准 5.18 说
A pair of expressions separated by a comma is evaluated left-to-right;
the left expression is a discardedvalue expression (Clause 5).86 Every
value computation and side effect associated with the left expression
is sequenced before every value computation and side effect associated
with the right expression. The type and value of the result are the
type and value of the right operand; the result is of the same value
category as its right operand, and is a bit-field if its right operand
is a glvalue and a bit-field. If the value of the right operand is a
temporary (12.2), the result is that temporary.
所以是的,根据标准,return计算第二个操作数的值是预期的行为。
但是,you can overload comma operator,在这种情况下,它可以return任何你想要的。
不是exactly.for int double 这样的基类型,是对的。
而对于我们的 class ,我们可以覆盖 , 运算符并决定运算符 returns 是什么。
boost lib中有一个很好的例子,功能是关于向量的插入。
#include <iostream>
int main() {
if(1 == 2, true) {
std::cout << "right" << std::endl;
} else std::cout << "left" << std::endl;
return 0;
}
它输出'right',总是这样吗?
编译器是否可以只优化左边的操作数,因为它没有被使用?
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' 我看不到任何警告和预期结果,所以我猜那里 这里没有问题。
C++ 标准 5.18 说
A pair of expressions separated by a comma is evaluated left-to-right; the left expression is a discardedvalue expression (Clause 5).86 Every value computation and side effect associated with the left expression is sequenced before every value computation and side effect associated with the right expression. The type and value of the result are the type and value of the right operand; the result is of the same value category as its right operand, and is a bit-field if its right operand is a glvalue and a bit-field. If the value of the right operand is a temporary (12.2), the result is that temporary.
所以是的,根据标准,return计算第二个操作数的值是预期的行为。
但是,you can overload comma operator,在这种情况下,它可以return任何你想要的。
不是exactly.for int double 这样的基类型,是对的。 而对于我们的 class ,我们可以覆盖 , 运算符并决定运算符 returns 是什么。 boost lib中有一个很好的例子,功能是关于向量的插入。