次のコードは問題なくコンパイルされます。
int main() {
printf("Hi" "Bye");
}
ただし、これはコンパイルされません。
int main() {
int test = 0;
printf("Hi" (test ? "Bye" : "Goodbye"));
}
その理由は何ですか?
"Hi"
と"Bye"
されている文字列リテラルではなく、文字列 C標準ライブラリで使用されるように。では、文字列リテラル、コンパイラが連結します"H\0i" "B\0ye"
。同じではありませんsprintf(buf,"%s%s", "H\0i" "B\0ye");
a (some_condition ? + : - ) b
printf("Hi" ("Bye"));
動作しないことにも注意してください。三項演算子は必要ありません。括弧で十分です(ただし、printf("Hi" test ? "Bye" : "Goodbye")
コンパイルされません)。文字列リテラルに続くことができるトークンの数は限られています。カンマ,
、角かっこを開く、角かっこ[
を閉じる]
(例のように1["abc"]
—はい、それは厄介です)、丸かっこ)
を閉じる(中かっこを閉じる}
(初期化子または同様のコンテキスト))、セミコロン;
は正当です(および別の文字列リテラル); 他にあるかどうかはわかりません。