2016-02-28 2 views
3
std::cout << (abs(b - c) < a) && a < b + c ? 1 : 0; 

Я хочу проверить, могут ли заданные значения создать треугольник. Я получил предупреждения:Предупреждение: второй/третий операнд условного значения не имеет эффекта [-Унимое значение]

second operand of conditional expression has no effect [-Wunused-value] 
third operand of conditional expression has no effect [-Wunused-value] 

Что случилось?

ответ

7

Ваш код переводится:

((std::cout << (abs(b - c) < a)) && a < b + c) ? 1 : 0; 

Во-первых, operator<< имеет более высокую, чем operator precedenceoperator&&.

только значение abs(b - c) < a будет распечатано и (a < b + c ? 1 : 0) части будет и объединено с возвращаемым значением 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); 

или

std::cout << (abs(b - c) < a && (a < b + c ? 1 : 0)); 

В самом деле, они эквивалентны (кроме, что один называет operator<< с bool, а другой с int), не требуется тройной оператор:

std::cout << (abs(b - c) < a && a < b + c); 
+1

Я имел в виду 'std :: cout << ((abs (b-c) Wobbly

Смежные вопросы