A linguagem C original foi projetada em 1969-1972, quando a computação ainda era dominada pelo cartão perfurado de 80 colunas. Seus projetistas usaram 80 dispositivos de coluna, como o Teletype ASR-33. Esses dispositivos não agrupavam automaticamente o texto, portanto havia um incentivo real para manter o código-fonte dentro de 80 colunas. Fortran e Cobol tinham mecanismos explícitos de continuação para fazê-lo, antes de finalmente mudarem para o formato livre.
Foi um golpe de brilhantismo para Dennis Ritchie (suponho) perceber que não havia ambiguidade na gramática e que longas seqüências ASCII podiam ser ajustadas em 80 colunas pelo simples expediente de fazer o compilador concatenar seqüências literais adjacentes. Inúmeros programadores C ficaram gratos por esse pequeno recurso.
Depois que o recurso é inserido, por que ele seria removido? Não causa tristeza e é frequentemente útil. Eu, pelo menos, gostaria de ter mais idiomas. A tendência moderna é ter seqüências estendidas com aspas triplas ou outros símbolos, mas a simplicidade desse recurso em C nunca foi superada.
Outro motivo é que ele permite a concatenação de macros de pré-processador definidas como literais de seqüência de caracteres, por exemplo, #define FOO "foo-value"seguidas posteriormente por"FOO's value is " FOO "."
Blrfl 4/15
3
@Blrfl: Apenas isso. É importante perceber que a concatenação de cadeias ocorre após a substituição da macro.
David.pfx
7
C não possui um operador de concatenação de string específico ( +) como C # e Java. Em C # ou Java, quando o compilador vê
"a"+"b"
ele pode compilar o código exatamente como se
"ab"
foram escritos no código fonte. Em C, no entanto, não há sintaxe igualmente fácil para descrever a concatenação de seqüências de caracteres que o compilador pode reconhecer e pré-calcular. Então, os designers de C décadas atrás escolheram que
"a""b"
significaria exatamente a mesma coisa que
"ab"
Naturalmente, o C ++ herdou a mesma convenção. Enquanto o padrão C ++ sobrecargas biblioteca +sobre std::stringa concatenação média corda, o compilador não tenta coalesce "a" + "b"porque isso é realmente um erro (você não pode adicionar dois const char *ponteiros juntos).
C também não possui um tipo de sequência específico, optando por ponteiros para caracteres na memória. Você não pode adicionar ponteiros e, mesmo que de +alguma forma signifique concatenação, ainda precisa resolver o problema de onde fica a memória da seqüência concatenada.
#define FOO "foo-value"
seguidas posteriormente por"FOO's value is " FOO "."
C não possui um operador de concatenação de string específico (
+
) como C # e Java. Em C # ou Java, quando o compilador vêele pode compilar o código exatamente como se
foram escritos no código fonte. Em C, no entanto, não há sintaxe igualmente fácil para descrever a concatenação de seqüências de caracteres que o compilador pode reconhecer e pré-calcular. Então, os designers de C décadas atrás escolheram que
significaria exatamente a mesma coisa que
Naturalmente, o C ++ herdou a mesma convenção. Enquanto o padrão C ++ sobrecargas biblioteca
+
sobrestd::string
a concatenação média corda, o compilador não tenta coalesce"a" + "b"
porque isso é realmente um erro (você não pode adicionar doisconst char *
ponteiros juntos).fonte
+
alguma forma signifique concatenação, ainda precisa resolver o problema de onde fica a memória da seqüência concatenada.