Le code suivant se compile sans problème:
int main() {
printf("Hi" "Bye");
}
Cependant, cela ne compile pas:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
Quelle est la raison de ceci?
"Hi"
et "Bye"
sont des chaînes littérales , pas des chaînes telles qu'utilisées dans la bibliothèque standard C. Avec les chaînes littérales , le compilateur concaténera "H\0i" "B\0ye"
. Pas la même chose avecsprintf(buf,"%s%s", "H\0i" "B\0ye");
a (some_condition ? + : - ) b
printf("Hi" ("Bye"));
ne fonctionnera pas - cela ne nécessite pas l'opérateur ternaire; la parenthèse est suffisante (mais printf("Hi" test ? "Bye" : "Goodbye")
ne compilerait pas non plus). Il n'existe qu'un nombre limité de jetons pouvant suivre un littéral de chaîne. La virgule ,
, le crochet ouvert, le crochet [
fermé ]
(comme dans 1["abc"]
- et oui, c'est horrible), le crochet rond )
fermé, le crochet bouclé }
(dans un initialiseur ou un contexte similaire) et le point ;
- virgule sont légitimes (et une autre chaîne littérale); Je ne suis pas sûr qu'il y en ait d'autres.