2010-02-24 16 views
14
#include <iostream> 


int main() 
{ 
    const std::string exclam = "!"; 
    const std::string message = "Hello" + ", world" + exclam; 
    std::cout << message; 
    return 0; 
} 

Perché questo codice non funziona? Errore restituito:Impossibile aggiungere stringhe in C++

error: invalid operands of types `const char[6]' and `const char[8]' to binary `operator+' 

Grazie in anticipo!

MODIFICA:

Grazie per tutte le risposte. Questa è la mia prima volta sul sito e sono sbalordito dal numero di spiegazioni elaborate in un intervallo di tempo così breve.

Riguardo alla domanda reale. Com'è possibile:

const std::string hello = "Hello"; 
const std::string message = hello + ", world" + "!"; 

Forse perché ", mondo" e in seguito "!" ottenere concatenato con ciao variabile (che è definito)?

+0

Perché non fare: const std :: string message = "Ciao, mondo" + esclam; –

+0

Benvenuti nel sito! Solo FYI, se c'è una risposta che ti piace, assicurati di accettarla. È più probabile che tu aiuti in futuro. – JasCav

risposta

18

Perché in C++, le stringhe letterali (come "Hello" non sono di tipo std::string. Essi sono array char semplici o stringhe in stile C.

Così, per la linea const std::string message = "Hello" + ", world" + exclam;, i tipi il compilatore deve lavorare con sono :

const std::string message = const char[6] + const char[8] + std::string;

e data l'associatività di +, le operazioni che deve svolgere sono:

const std::string message = ((const char[6] + const char[8]) + std::string);

Cioè, l'addizione all'estrema sinistra deve essere valutata per prima, e il risultato è passato all'aggiunta più a destra.

Quindi il compilatore prova a valutare const char[6] + const char[8]. Non è stata definita alcuna aggiunta per gli array. Gli array sono convertiti implicitamente in puntatori, ma questo non aiuta il compilatore. Ciò significa che termina con const char* + const char* e non è stata definita alcuna aggiunta per i puntatori.

A questo punto, non si sa che si desidera convertire il risultato in std::string.

Tuttavia, nel secondo esempio:

const std::string hello = "Hello"; 
const std::string message = hello + ", world" + "!"; 

funziona, perché le operazioni il compilatore avrebbe visto erano std::string + const char[8] + const char[2]. Qui, la prima aggiunta può essere convertita in std::string + const char* e qui l'operatore di addizione è definito e restituisce un std::string. Quindi il compilatore ha calcolato con successo la prima aggiunta, e dal momento che il risultato era una stringa, la seconda aggiunta appare così: std::string + const char[2], e come prima, questo non è possibile, ma la matrice può essere convertita in un puntatore, e quindi il compilatore è in grado di trovare un operatore di addizione che funziona, di nuovo risultante in un std::string.

+5

+1, @jalf - risposta eccellente –

4

Nella riga in cui si forma il messaggio, l'intera espressione a destra di = viene eseguita per prima e solo successivamente viene assegnata a una stringa C++. A quel punto, il tuo "Ciao" e il tuo "Mondo" sono ancora stringhe in C (const char []), motivo per cui ricevi un errore. L'addizione va da sinistra a destra, quindi la coppia delle stringhe C viene aggiunta prima di tentare di aggiungere la combinazione all'oggetto esclam std :: string.

È necessario eseguire il cast all'interno dell'espressione (ad es., Std :: string ("Hello")) o creare variabili di stringa per ciascuna di esse come con Exclam.

15
"Hello" + ", world" 

Poiché si tratta di stringhe in stile c, non è possibile aggiungerle con +. Puoi aggiungere una std :: string a una stringa in stile c, ma non a 2 stringhe in stile c in questo modo, aggiungi invece un costruttore std :: string() attorno a uno di essi per creare un codice temporaneo, ovvero:

"Hello" + std::string(", world") 
+4

Potrebbe anche solo omettere l'operatore '+' tra '" Hello "' e '", world "' like: 'const std :: string message =" Ciao "", mondo "+ esclam;' Questo è anche un modo accettabile per concatenare stringhe letterali. – fogo

4

I letterali stringa sono semplicemente array di caratteri terminati da zero in C++. Non c'è operatore che ti permetta di aggiungere 2 matrici di caratteri in C++.

Esiste tuttavia un array di caratteri e un operatore std :: string +.

Passa a:

const std::string message = std::string("Hello") +", world" + exclam; 

In alcuni linguaggi come Python stringhe letterali sono equivalenti a variabili di stringhe tipo. Il C++ non è un tale linguaggio.

6

C++ non esegue molte conversazioni "dietro le quinte" automatiche di altre lingue OO.

Come Doug ha detto che devi fare std :: string ("ciao") + std :: string ("mondo"), la lingua non fa questo per te.

Tuttavia si può fare

std::cout << "hello" << "world" << exclam; 

Perché std :: cout sa come stampare un const char [], così come una stringa

3

stringhe C-style ("Ciao" e", mondo ") sono equivalenti agli array anonimi:

static const char anon1[6] = { 'H', 'e', 'l', 'l', 'o', '\0' }; 
static const char anon2[8] = { ',', ' ', 'w', 'o', 'r', 'l', 'd', '\0' }; 

...quindi quando si digita "Hello" + ", world", si sta tentando di aggiungere due array anon1 + anon2 che non è un'operazione supportata da C o C++.

Ricordare che i valori letterali di stringa in C/C++ sono solo matrici (o indirizzi di matrici). Devi utilizzare una classe di stringa (ad esempio std:string) per utilizzare operatori come +.