Условный оператор, используемый в выражении cout - PullRequest
10 голосов
/ 08 марта 2012

Попытавшись, я узнал, что необходимо заключить скобки вокруг условного оператора в оператор cout. Вот небольшой пример:

#include <iostream>

int main() {
  int a = 5;
  float b = (a!=0) ? 42.0f : -42.0f;
  // works fine
  std::cout << b << std::endl;
  // works also fine
  std::cout << ( (a != 0) ? 42.0f : -42.0f ) << std::endl;
  // does not work fine
  std::cout << (a != 0) ? 42.0f : -42.0f;

  return 0;
}

Вывод:

42
42
1

Зачем нужны эти скобки? Результирующий тип условного оператора известен в обоих случаях, не так ли?

Ответы [ 2 ]

17 голосов
/ 08 марта 2012

Оператор ?: имеет более низкий приоритет, чем оператор <<.То есть компилятор интерпретирует ваше последнее выражение как:

(std::cout << (a != 0)) ? 42.0f : -42.0f;

, которое сначала будет передавать потоковое логическое значение (a!=0) в cout.Затем результат этого выражения (т.е. ссылка на cout) будет приведен к соответствующему типу для использования в операторе?: (А именно: void*: см. http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/), и в зависимости от того, является ли это значение истинным (то есть, если cout не имеет установленных флагов ошибок), он получит либо значение 42, либо значение-42. Наконец, он выбросит это значение (поскольку его никто не использует).

5 голосов
/ 08 марта 2012

Потому что << имеет более высокий приоритет, чем ?.

Веселое упражнение:

float ftest = std::cout << (a != 0) ? 42.0f : -42.0f;

Примите это, Coding Horror !!!

Ваш кодэквивалентно:

if ( std::cout << (a != 0) )
     42.0f;
else
    -42.0f;

Он выводит 1, потому что, ну, (a != 0) == true;

...