【发布时间】:2016-10-28 14:28:34
【问题描述】:
#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' 我看不到任何警告,以及预期的结果,所以我猜那里 没有这里有问题。
【问题讨论】:
-
"不要问两次" 为什么不呢?不同的问题应该放在不同的问题帖子中。
-
@MikeCAT,只是聚合查询的合理习惯
-
这两个问题不相关,应该分开提问和回答。
-
btw 执行顺序不是“未定义的行为”,但它只是未定义的,即。在某些情况下,您不能依赖操作顺序。但是,您的示例的唯一问题是可读性
标签: c++ operators operator-precedence