Вопрос по conditional-operator, c++ – Условный оператор, используемый в выражении cout

10

Попытавшись, я узнал, что необходимо заключить скобки вокруг условного оператора в оператор 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

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

(std::cout << (a != 0)) ? 42..0f;

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

И вот я снова пытаюсь казаться умным. Спасибо за исправление моей коррекции. :) Sam DeHaan
спасибо, даже не думал о прецедентах m47h
Просто записка,cout<< возвращаетсяcout, не о действительном состоянии. failbit / badbit будет установлен, но(std::cout << (a != 0)) всегда возвращает ссылку наstd::cout. -42.0f никогда не должен возвращаться, так как эта ссылка всегда должна иметь логическое значение true. Sam DeHaan
Начиная с C ++ 11, это неoperator void*, ноexplicit operator bool en.cppreference.com/w/cpp/io/basic_ios/operator_bool Caleth
@SamDeHaan: да. Извините, возможно, я был немного неряшлив в своем объяснении. Выражение «cout << x» возвращает cout. Но для того, чтобы выражение «cout? A: b» было оценено, сначала необходимо привести к значению cout некоторое значение, которое является допустимым операндом оператора?:. В этом случае это (оператор void *), который делает работу. Этот оператор возвращает NULL, если установлен флаг ошибки. Смотрите: <cplusplus.com/reference/iostream/ios/operator_voidpt> Edward Loper
5

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

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

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

Возьми это, код ужас!

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

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

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

Похожие вопросы