34
char* a="dsa" "qwe";
printf("%s", a);

出力:dsaqwe

私の質問は、なぜこれが機能するのかということです。2 つの文字列リテラルの間にスペースを入れるか何も指定しないと、文字列リテラルが連結されます。

これはどのように機能していますか?

4

4 に答える 4

47

これは ISO C 標準で定義されており、隣接する文字列リテラルが 1 つに結合されます。

言語は少し乾いています (結局のところ標準です) が6.4.5 String literalsC11状態のセクション:

変換フェーズ 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 :-)";
于 2012-08-25T09:58:51.310 に答える
12

そして、「これは何の役に立つの?」という素朴な疑問に答えるために。

1 つには、定数を文字列リテラルに入れることができます。あなたは書ける

#define FIRST "John"
#define LAST "Doe"

const char* name = FIRST " " LAST;
const char* salutation = "Dear " FIRST ",";

後で名前を変更する必要がある場合は、1 か所だけ変更するだけで済みます。
そういうもの。

于 2012-08-25T11:01:37.380 に答える
6

あなたはあなた自身の質問に答えました。

2 つの文字列リテラルの間にスペースを入れるか何も指定しないと、文字列リテラルが連結されます。

これは C 構文の特徴の 1 つです。

于 2012-08-25T09:54:55.843 に答える
1

ISO C規格は次の§5.1.1.2ように述べています:-

  1. 隣接する文字列リテラル トークンは連結されます。
  2. トークンを区切る空白文字は重要ではなくなりました。
于 2012-08-25T10:02:56.503 に答える