2015-03-10 5 views
21
#include <iostream> 
int main() 
{ 
    std::cout << "25"+1; 
    return 0; 
} 

Sto ricevendo "5" come output. quando uso "5" + 1, l'output è vuoto, "456" l'uscita +1 è "56". confuso cosa sta succedendo dietro le quinte.Perché nel codice "456" +1, l'output è "56"

+1

Cosa ti aspetti che succeda quando fai "25" +1? – jsantander

+42

E '" ciao "+ 1' è' "ciao" ', stai ancora individuando un modello? – molbdnilo

+10

Se si aggiunge la patata alla banana, con quante frobnitz ci si ritrova? – Shadur

risposta

50

La stringa letterale "25" è davvero un array di caratteri di tipo const char[3] con valori {'2', '5', '\0'} (i due caratteri visualizzati e un nullo terminatore.) In C e C++, gli array può facilmente decadere ai puntatori al loro primo elemento. Questo è ciò che accade in questa espressione:

"25" + 1 

dove "25" decade a &"25"[0], o un puntatore al primo carattere. Aggiungendo 1 a quello si ottiene un puntatore a 5.

Oltre a questo, std::ostream, di cui std::cout è un'istanza, stampa una const char* (si noti che char* sarebbe anche funzionare) ipotizzando che è una stringa con terminazione null. Quindi, in questo caso, stampa solo 5.

14

Dietro le quinte, "25" è una matrice di tre caratteri: due che rappresentano '2' e '5' e un terminatore con il valore zero per contrassegnare la fine.

Una matrice è una creatura un po 'strana, con la tendenza a cambiare in un puntatore (al primo elemento) se si fa qualcosa con esso. Ecco cosa sta succedendo qui: l'aggiunta di uno a un array non ha senso, quindi si trasforma in un puntatore. Aggiungendone uno si ottiene un puntatore al secondo carattere.

Quando viene assegnato un puntatore a un carattere, << presuppone che punti a una stringa terminata e continua a stampare caratteri finché non trova un terminatore (o esplode in qualche modo, se non ce n'è uno). Quindi dargli un puntatore al secondo carattere di una stringa stamperà tutti i personaggi dal secondo in poi, come hai osservato.

Se sei nuovo di C e C++, dovresti prima decidere quale lingua imparare, poiché sono molto diversi. Se scegli il C++, dovresti familiarizzare con la sua libreria amichevole di alto livello (come ad esempio std::string per gestire le stringhe senza questo tipo di stranezze) prima di immergerti nella follia di basso livello di array e puntatori.

+0

@Mike Seymour: std :: string s = "25" +1; std :: cout << s; dà anche 5 come output. – Destructor

+1

@meet: ovviamente lo fa. "25" +1 ha lo stesso significato qualunque cosa tu faccia con esso. –

2

Quando scrivi un "", il compilatore capisce che stai mettendo una stringa all'interno. In questo caso, stai usando la funzione cout, quindi stampa sullo schermo questa stringa. Si sta operando con le stringhe quando si utilizza l'operatore '+', quindi si sta eseguendo un'operazione di spostamento prima di inviarlo al cout.

+0

Sbagliato.Una stringa letterale è un 'char *' non un 'std :: string' –

+1

@BasileStarynkevitch Per essere onesti, non dice' std :: string'. Inoltre, una stringa letterale è una matrice di 'const char', non un puntatore. – juanchopanza

+0

Non sono sicuro della matrice 'const char'. Penso che lo standard dica 'char' per ragioni storiche. –