Nel concatenare i valori letterali stringa adiacenti

13

C e C ++ compila letterali stringa adiacenti come un letterale a stringa singola. Ad esempio questo:

"Some text..." "and more text"

è equivalente a:

"Some text...and more text"

In altri linguaggi della famiglia C come C # o Java, si tratta di un errore di sintassi (che è perfettamente corretto in BTW).

Qual è il motivo logico / storico per C e C ++ per fare questo?

    
posta Krumia 01.09.2014 - 03:38
fonte

2 risposte

16

Il linguaggio C originale fu progettato nel 1969-1972 quando il computer era ancora dominato dalla scheda perforata da 80 colonne. I suoi progettisti hanno utilizzato 80 dispositivi a colonna come il Teletype ASR-33. Questi dispositivi non includevano automaticamente il testo, quindi c'era un vero incentivo a mantenere il codice sorgente entro 80 colonne. Fortran e Cobol avevano meccanismi di continuazione espliciti per farlo, prima di passare finalmente al formato libero.

È stato un colpo di genio per Dennis Ritchie (suppongo) rendermi conto che non c'era alcuna ambiguità nella grammatica e che le lunghe stringhe ASCII potevano essere adattate a 80 colonne con il semplice espediente di far concatenare il compilatore adiacente stringhe letterali. Innumerevoli programmatori C erano grati per quella piccola funzionalità.

Una volta che la funzione è presente, perché dovrebbe mai essere rimossa? Non provoca dolore ed è spesso utile. Per un desiderio ho avuto più lingue. La tendenza moderna è quella di avere stringhe estese con virgolette triple o altri simboli, ma la semplicità di questa caratteristica in C non è mai stata superata.

    
risposta data 01.09.2014 - 12:54
fonte
7

C non ha un operatore di concatenazione di stringhe specifico ( + ) come C # e Java. In C # o Java, quando il compilatore vede

"a" + "b"

può compilare il codice esattamente come se

"ab"

sono stati scritti nel codice sorgente. In C, tuttavia, non esiste una sintassi altrettanto semplice per descrivere la concatenazione di stringhe che il compilatore può riconoscere e precalcolare. Così i progettisti di C decenni fa hanno scelto questo

"a" "b"

significherebbe esattamente la stessa cosa di

"ab"

Naturalmente C ++ ha ereditato la stessa convenzione. Mentre la libreria standard di C ++ sovraccarica + su std::string per significare concatenazione di stringhe, il compilatore non tenta di coalesce "a" + "b" perché questo è in realtà un errore (non è possibile aggiungere due puntatori const char * insieme).

    
risposta data 01.09.2014 - 03:42
fonte

Leggi altre domande sui tag