2015-01-08 15 views
5

Il seguente codice deve rimuovere l'ultimo carattere di una stringa e aggiungere l (L minuscola) se flip è vero o r se è falso.Comportamento anomalo con funzionamento ternario

std::stringstream ss; 
ss << code.substr(0, code.size() - 1); 
ss << flip ? "l" : "r"; 
std::string _code = ss.str(); 

Tuttavia, quando flip è vero, aggiunge 1 e quando è falsa, aggiunge 0. Come mai?

+0

non relativo al problema a portata di mano, ma perché usare 'std :: stringstream' qui? Basta copiare la stringa, quindi impostare l'ultimo carattere usando 's [s.size() - 1] = (flip? 'L': 'r');'. (Del resto, non penso di aver mai usato 'std :: stringsream', anche se' std :: istringstream' e 'std :: ostringstream' appaiono frequentemente nel mio codice.) –

risposta

18

Problema di precedenza.

ss << flip ? "l" : "r"; 

significa

(ss << flip) ? "l" : "r"; 

Usa

ss << (flip ? "l" : "r"); 
3

Ha a che fare con la precedenza degli operatori. << ha la priorità su ? che significa che flip viene aggiunto prima a ss.

Il seguente dovrebbe portare il comportamento previsto:

ss << (flip ? "l" : "r");