次のコードは問題なくコンパイルされます。
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"]—はい、それは厄介です)、丸かっこ)を閉じる(中かっこを閉じる}(初期化子または同様のコンテキスト))、セミコロン;は正当です(および別の文字列リテラル); 他にあるかどうかはわかりません。