Что еще делает для меня оператор условия в C ++? - PullRequest
6 голосов
/ 07 июля 2011

У меня странная ошибка компиляции при использовании оператора условия.

a,b имеют значение int, и следующее выражение получает ошибку компиляции.

(a>b)?( std::cout << a ) : ( b=MAX );
16 (b <unknown operator> 5)' 

(a>b)?( a=MAX ) : ( std::cout<<b );
16 (&std::cout)->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](b)' 

Но это выражение работает хорошо, что странно ..

(a>b)?( std::cout << a ) : ( std::cout<<b );

Я понятия не имею, что делает такую ​​разницу, и не знаю, почему ошибка компиляции. Вот моя информация о gcc:

Reading specs from ./../lib/gcc/mingw32/3.4.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --e
nable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-ja
va-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchroniz
ation --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.2 (mingw-special)`

Ответы [ 3 ]

14 голосов
/ 07 июля 2011

Условный оператор всегда должен возвращать один и тот же тип.В первом примере

(a > b) ? (std::cout << a) : (b = MAX);

первая ветвь возвращает тип std::ostream, а вторая ветвь - тип b (что, вероятно, является целым числом, учитывая его контекст).Ваш второй пример,

(a > b) ? (std::cout << a) : (std::cout << b);

не имеет такой проблемы, потому что обе ветви возвращают один и тот же тип, std::ostream.В любом случае, вероятно, было бы чище справиться с этими условиями с помощью простого оператора if - else.Условный оператор имеет тенденцию ухудшать читабельность и обычно полезен, только когда условно присваивает переменной:

int a = (a > b) ? a : b;
std::cout << a;
4 голосов
/ 07 июля 2011

?: является оператором в выражении (или подвыражении).Выражение имеет тип.Каким должен быть тип (a > b) ? (std::cout << a) : (b = MAX).Типы в C ++ оцениваются статически, и компилятор не может определить общий тип для std::cout << a (тип std::ostream&) и b = MAX (тип int).

2 голосов
/ 07 июля 2011

Что еще мне делает оператор условия в C ++?

Что ж, он выполняет сопоставление типов второго и третьего аргументов, и это может быть весьма полезным для извлечения типов из выражений. Для умопомрачительной статьи о том, как использовать эту функцию условного оператора, прочитайте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...