2010-12-10 27 views
3

J'essayais de comprendre quelque chose quand je l'ai écrit cela par une erreurprintf ("string1" "string2") est ce C valide?

printf("string1""string2"); 

À ma grande surprise, il a compilé et produit une sortie de chaîne concaténée i.e.

string1string2 

Est-ce valide C?

J'utilise gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

+1

est-ce pas merveilleux? :) –

Répondre

7

Oui c'est. littéraux de chaîne consécutifs sont concaténés au début de l'analyse de C.

6.4.5/4:

Dans la phase de translation 6, les séquences de caractères multi-octets spécifiés par toute séquence de caractères adjacentes et une large chaîne de jetons littéraux sont concaténé en une seule séquence de caractères multi-octets. Si l'un des jetons est un jeton littéral à chaîne large, la séquence de caractères multi-octets résultante est traitée comme un littéral de chaîne large; sinon, il est traité comme un littéral de chaîne de caractères.

2

Oui, il est valide et a fait partie de la langue C pendant un temps très long (sinon depuis le début). La concaténation est effectuée au moment de la compilation.

1

Comme d'autres l'ont dit, oui, c'est valide. Je voulais juste ajouter qu'il est vraiment utile d'entrer de longues chaînes qui remplissent plusieurs lignes. Vous ne devez pas salir avec \ pour indiquer la chaîne continue, et ne voulant pas ajouter un retour chariot aussi, de sorte que vous écrivez simplement:

"very long string " 
"that continues over here" 

(montre les espaces à la fin de chaque chaîne , c'est une erreur courante Dans ce cas, "string" et "that" seraient joints.)

3

Oui, et il peut être très utile de concaténer les constantes de chaîne à la compilation.

#define VERSION "1.0" 
#define COMPANY "Trivial Software" 

printf("hello world: v. " VERSION " copyright (c) " COMPANY); 

ou

puts(
    "blah blah blah\n" 
    "blah blah blah\n" 
    "blah blah blah\n" 
    "blah blah blah\n" 
); 
+0

Nice. Oui, je l'ai aussi utilisé. –