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.