警告:条件的第二个/第三个操作数无效[-Wunused-value]

Wob*_*bly 4 c++ gcc operator-precedence

std::cout << (abs(b - c) < a) && a < b + c ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

我想检查给定的值是否可以创建三角形.我收到了警告:

second operand of conditional expression has no effect [-Wunused-value]
third operand of conditional expression has no effect [-Wunused-value]
Run Code Online (Sandbox Code Playgroud)

怎么了?

Log*_*uff 10

您的代码转换为:

((std::cout << (abs(b - c) < a)) && a < b + c) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

首先,operator<<具有更高的运算符优先级operator&&.

abs(b - c) < a打印值,(a < b + c ? 1 : 0)零件将与返回值一起进行AND运算std::ostream::operator bool.

但警告是关于1并且0没有分配给任何东西也没有任何副作用,因为&&在三元条件(?:)之前.


正确的代码是:

std::cout << (abs(b - c) < a && a < b + c ? 1 : 0);
// same as std::cout << ((abs(b - c) < a && a < b + c) ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

要么

std::cout << (abs(b - c) < a && (a < b + c ? 1 : 0));
Run Code Online (Sandbox Code Playgroud)

事实上,他们是相当的(除了一个电话operator<<bool和其他与int),没有三元操作需要:

std::cout << (abs(b - c) < a && a < b + c);
Run Code Online (Sandbox Code Playgroud)