2011-07-07 2 views
6

Ho un errore di compilazione strano durante l'utilizzo dell'operatore condizione.Cos'altro fa l'operatore di condizioni in C++ per me?

a,b sono il valore int e la seguente espressione ottiene errore di compilazione.

(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)' 

Ma questa espressione funziona bene, il che è strano ..

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

ho idea che cosa rende una tale differenza, e non so perché stare l'errore di compilazione per. Ecco le mie informazioni 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)` 
+1

Mettere le dichiarazioni con effetti collaterali in un'espressione condizionale sembra piuttosto brutto. Perché non usare una dichiarazione if tradizionale? –

+0

@Johannes: ho contrassegnato il tuo commento come non costruttivo. Perché non un commento che spiega perché non ti piace così tanto la domanda, invece di essere semplicemente maleducato? –

+0

@Brennan Penso che l'interrogante lo sappia molto bene. Ho provato a risolverlo modificandolo, ma è incomprensibile. Non ho mai visto un 16 chiamato come una funzione, e mai visto un essere usato in C++ (e non è neanche una diagnostica GCC). Se non si formatta la tua domanda correttamente, essendo il SE per oltre un anno, è necessario almeno affermare in un formato che consente ad altre persone di formattarlo. Ecco perché ho -1'ed. Ho rimosso il mio altro commento perché ho scoperto che in realtà non è utile. –

risposta

14

L'operatore condizionale deve sempre restituire lo stesso tipo. Nel primo esempio,

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

il primo ramo produce il tipo std::ostream e il secondo ramo produce il tipo di b (che è probabilmente un numero intero, dato il suo contesto). Il tuo secondo esempio,

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

non ha tale problema perché entrambi i rami restituiscono lo stesso tipo, std::ostream. In entrambi i casi, sarebbe probabilmente più pulito per gestire queste condizioni con una semplice if-else dichiarazione. L'operatore condizionale tende a danneggiare la leggibilità ed è tipicamente utile solo quando condizionatamente assegnando ad una variabile:

int a = (a > b) ? a : b; 
std::cout << a; 
+5

Just a NIT (perché a livello globale, la risposta è meglio espresso del mio), ma le regole per i tipi di 'b' e' c' in 'a? b: c' sono un po 'più complicati. Fondamentalmente, il compilatore deve essere in grado di convertire uno dei tipi nell'altro.Quindi puoi avere 'long' e' int', o 'Base *' e 'Derived *' (ma non 'Derived1 *' e 'Derived2 *'). In alternativa, una delle espressioni può essere un'espressione 'throw', nel qual caso il tipo dell'espressione è l'altro tipo. –

+0

Infatti, 'void * p = 0; (a> b)? (std :: cout << a): (p = malloc (1)); 'sarebbe perfettamente perfetto, per esempio. –

+6

Un altro modo per risolvere questo problema è usare l'operatore virgola: '(a> b)? ((std :: cout << a), a): (b = MAX); 'Questo ha il vantaggio di rendere il codice ancora più oscuro. ;) –

4

il ?: è un operatore in un'espressione (o sub-espressione). Un'espressione ha un tipo. Quale dovrebbe essere il tipo di (a > b) ? (std::cout << a) : (b = MAX). Tipi in C++ sono valutati in modo statico, e non c'è modo in cui il compilatore in grado di determinare un tipo comune per std::cout << a (tipo std::ostream&) e b = MAX (tipo int).

+0

Sì, la chiave qui è la parte _ "Un'espressione ha un tipo" _. –

2

Cos'altro fa l'operatore di condizioni in C++ per me?

Beh, lo fa digitare corrispondenza del secondo e terzo argomento, e che può essere molto utile come un modo di estrarre i tipi di espressioni. Per una mente che soffia articolo su come utilizzare questa funzione dell'operatore condizionale, leggere here