1. ホーム
  2. c

[解決済み] なぜC言語では、条件演算子を使って文字列を連結することができないのですか?

2023-01-15 08:09:27

質問

以下のコードは問題なくコンパイルできます。

int main() {
    printf("Hi" "Bye");
}

しかし、これではコンパイルできません。

int main() {
    int test = 0;
    printf("Hi" (test ? "Bye" : "Goodbye"));
}

その理由は何でしょうか?

どのように解決するのですか?

C言語規格 (5.1.1.2 翻訳フェーズ) によると

1 翻訳の構文規則間の優先順位は、以下のフェーズで規定されています。 次のフェーズによって指定されます6)。

  1. 隣接する文字列リテラルのトークンは連結されます。

そして、その後にのみ

<ブロッククオート
  1. トークンを区切る空白文字は、もはや重要ではありません。各 はトークンに変換されます。 結果として得られる トークンは構文的、意味的に分析され、翻訳ユニットとして翻訳されます。 翻訳ユニット .

この構造では

"Hi" (test ? "Bye" : "Goodbye")

には、隣接する文字列リテラルのトークンは存在しません。したがって、この構築は無効です。