char* a="dsa" "qwe";
printf("%s", a);
出力:dsaqwe
私の質問は、なぜこれが機能するのかということです。2 つの文字列リテラルの間にスペースを入れるか何も指定しないと、文字列リテラルが連結されます。
これはどのように機能していますか?
これは ISO C 標準で定義されており、隣接する文字列リテラルが 1 つに結合されます。
言語は少し乾いています (結局のところ標準です) が6.4.5 String literals
、C11
状態のセクション:
変換フェーズ 6 では、隣接する文字の任意のシーケンスと同一のプレフィックスを持つワイド文字列リテラル トークンによって指定されるマルチバイト文字シーケンスが、単一のマルチバイト文字シーケンスに連結されます。
これは、同じ標準でも言及されて5.1.1.2 Translation phases, point 6
いますが、もう少し簡潔に:
隣接する文字列リテラル トークンは連結されます。
これは基本的に と"abc" "def"
変わらないことを意味し"abcdef"
ます。
次のような適切なフォーマットを保持しながら、長い文字列を作成する場合に便利です。
const char *myString = "This is a really long "
"string and I don't want "
"to make my lines in the "
"editor too long, because "
"I'm basically anal retentive :-)";
そして、「これは何の役に立つの?」という素朴な疑問に答えるために。
1 つには、定数を文字列リテラルに入れることができます。あなたは書ける
#define FIRST "John"
#define LAST "Doe"
const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";
後で名前を変更する必要がある場合は、1 か所だけ変更するだけで済みます。
そういうもの。
あなたはあなた自身の質問に答えました。
2 つの文字列リテラルの間にスペースを入れるか何も指定しないと、文字列リテラルが連結されます。
これは C 構文の特徴の 1 つです。
ISO C規格は次の§5.1.1.2
ように述べています:-
- 隣接する文字列リテラル トークンは連結されます。
- トークンを区切る空白文字は重要ではなくなりました。