使用条件运算符时,我遇到了一个奇怪的编译错误.
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)`
解决方法
条件运算符必须始终返回相同的类型.在你的第一个例子中,
(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;