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

stc*_*atz 6 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)' 
Run Code Online (Sandbox Code Playgroud)

但这个表达效果很好,这很奇怪..

(a>b)?( std::cout << a ) : ( std::cout<<b );
Run Code Online (Sandbox Code Playgroud)

我不知道是什么造成了这样的差异,并且不知道为什么编译错误代表.这是我的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)`
Run Code Online (Sandbox Code Playgroud)

Mic*_*val 14

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

(a > b) ? (std::cout << a) : (b = MAX);
Run Code Online (Sandbox Code Playgroud)

第一个分支产生类型std::ostream,第二个分支产生类型b(给定其上下文,它可能是一个整数).你的第二个例子,

(a > b) ? (std::cout << a) : (std::cout << b);
Run Code Online (Sandbox Code Playgroud)

没有这样的问题,因为两个分支返回相同的类型,std::ostream.在这两种情况下,它可能会更清洁处理一个简单的这些条件if- else声明.条件运算符往往会损害可读性,通常仅在有条件地分配给变量时才有用:

int a = (a > b) ? a : b;
std::cout << a;
Run Code Online (Sandbox Code Playgroud)

  • 解决这个问题的另一种方法是使用逗号运算符:`(a> b)?((std :: cout << a),a):( b = MAX);`这具有使代码更加模糊的额外好处.;) (6认同)
  • 只是一个人(因为在全球范围内,你的答案比我的更好),但是`a`中的`b`和`c`类型的规则?b:c`有点复杂.基本上,编译器必须能够将其中一种类型转换为另一种类型.所以你可以有`long`和`int`,或`Base*`和`Derived*`(但不是`Derived1*`和`Derived2*`).或者,其中一个表达式可以是`throw`表达式,在这种情况下,表达式的类型是另一种类型. (5认同)