C ++中的条件运算符还能为我做什么?

时间:2011-07-07 08:33:42

标签: c++ gcc conditional-operator

使用条件运算符时出现奇怪的编译错误。

a,bint值,以下表达式会出现编译错误。

(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 个答案:

答案 0 :(得分:14)

条件运算符必须始终返回相同的类型。在你的第一个例子中,

(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;

答案 1 :(得分:4)

?:是表达式(或子表达式)中的运算符。表达式具有类型。 (a > b) ? (std::cout << a) : (b = MAX)的类型应该是什么? C ++中的类型是静态评估的,编译器无法确定std::cout << a(类型std::ostream&)和b = MAX(类型int)的公共类型。

答案 2 :(得分:2)

  

C ++中的条件运算符还能为我做什么?

嗯,它确实对第二个和第三个参数进行了类型匹配,这对于从表达式中提取类型非常有用。有关如何使用条件运算符的该功能的令人兴奋的文章,请阅读here

相关问题