2015-05-03 17 views
31

Qualcuno può spiegare l'uscita del seguente programma:tipo di espressione ternaria

#include <iostream> 
using namespace std; 

int main() 
{ 
    int test = 0; 
    cout << "First character " << '1' << endl; 
    cout << "Second character " << (test ? 3 : '1') << endl; 

    return 0; 
} 

uscita:
Primo carattere 1
Secondo carattere 49

Ma entrambi i printf dichiarazioni dovrebbe stampare il stessa linea.

+4

È una buona domanda, ma non correlata agli effetti collaterali. – juanchopanza

risposta

34

Il tipo di espressione '1' è char.

Il tipo di espressione (test ? 3 : '1') è almeno int (o una versione senza firma dello stesso, portabile è std::common_type_t<int, char>).

Pertanto, le due chiamate dell'operatore << selezionano sovraccarichi diversi: il primo stampa il carattere così com'è, quest'ultimo formatta il numero intero come rappresentazione della stringa decimale. (Il valore integrale del carattere '1' è definito dal set di caratteri di base.)

5

cout visualizzerà valore (test ? 3 : '1') espressione dopo dedurre appropriato <<operator. In questo caso è int, è possibile verificare con bello trucco che Scott Meyers propagata nel suo newest book:

template < typename T > class TD; // Type Displayer 
int main() 
{ 
    int test = 0; 
    TD<decltype((test ? 3 : '1'))> xType; 

    return 0; 
} 

questo genera l'errore, che vi darà anche informazioni di tipo della vostra espressione:

main.cpp:6:34: error: aggregate 'TD<int> xType' has incomplete type and cannot be defined TD xType;

che è int. E static_cast<int>('1') è 49.

+2

'static_cast ('1')' è 49 su molti sistemi, ma non è richiesto. Ci sono sistemi in cui non lo sono. –

+0

IIIRC, string letterali/caratteri non devono essere in formato ASCII a meno che non si specifichi il formato (ad esempio 'u8'). Ci dovrebbe essere una domanda anche su questo. – edmz

Problemi correlati