Der folgende Code wird problemlos kompiliert:
int main() {
printf("Hi" "Bye");
}
Dies wird jedoch nicht kompiliert:
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
Was ist der Grund dafür?
"Hi"und "Bye"sind Stringliterale , nicht Strings , wie in der C - Standardbibliothek verwendet. Bei String-Literalen wird der Compiler verkettet "H\0i" "B\0ye". Nicht dasselbe mitsprintf(buf,"%s%s", "H\0i" "B\0ye");
a (some_condition ? + : - ) b
printf("Hi" ("Bye"));nicht einmal funktioniert - es ist kein ternärer Operator erforderlich. Die Klammer ist ausreichend ( printf("Hi" test ? "Bye" : "Goodbye")würde aber auch nicht kompiliert werden). Es gibt nur eine begrenzte Anzahl von Token, die einem Zeichenfolgenliteral folgen können. Komma ,, offene eckige Klammer [, enge eckige Klammer ](wie in 1["abc"]- und ja, es ist grausam), enge runde Klammer ), enge geschweifte Klammer }(in einem Initialisierer oder einem ähnlichen Kontext) und Semikolon ;sind legitim (und ein anderes Zeichenfolgenliteral); Ich bin mir nicht sicher, ob es noch andere gibt.