16

私は C++ を学んでいますが、答えが見つからない質問があります。

char定数 (一重引用符を使用) と文字列定数 (二重引用符を使用)の違いは何ですか?

char 配列 vs に関連するすべての検索結果std::string。私は と の違いを求め'a'てい"a"ます。

次のことを行うことに違いはありますか?

cout << "a";
cout << 'a';
4

6 に答える 6

35

'a'文字リテラルです。タイプcharは で、ほとんどのシステムで値は 97 です (文字の ASCII/Latin-1/Unicode エンコーディングa)。

"a"文字列リテラルです。タイプは で、値とを持つconst char[2]2 の配列を参照します。すべてではありませんが、ほとんどのコンテキストで、への参照は文字列の最初の文字へのポインタに暗黙的に変換されます。char'a''\0'"a"

両方

cout << 'a';

cout << "a";

たまたま同じ出力が生成されますが、理由は異なります。1 つ目は、1 文字の値を出力します。2 番目は、文字列のすべての文字 (終端の を除く'\0') を連続して出力します。これはたまたま単一の文字'a'です。

文字列リテラルは、 のように任意に長くすることができます"abcdefg"。文字リテラルには、ほとんどの場合、1 文字だけが含まれます。(などの複数文字リテラル'ab'を使用できますが、それらの値は実装定義であり、ほとんど役に立ちません。)

(あなたが尋ねなかった C では、'a'タイプはint"a"あり、タイプはchar[2](no const) です)。

于 2012-07-01T02:29:11.203 に答える
4

"a"\0は、たまたま 1 文字しか含まれていない文字の配列です。最後にを数えた場合は 2 文字です。'a'1文字です。それらは同じものではありません。例えば:

#include <stdio.h>

void test(char c) {
    printf("Got character %c\n", c);
}

void test(const char* c) {
    printf("Got string %s\n", c);
}

int main() {
    test('c');
    test("c");
}

これは、2 つの異なるオーバーロードを使用します。デモについては、 http://codepad.org/okl0UcCNを参照してください。

于 2012-07-01T02:28:43.163 に答える
1

文字リテラルは一重引用符で囲みます。二重引用符は、文字列 (文字配列) リテラルを囲むために使用されます。

などの多くのインターフェイスは、cout <<どちらも受け入れます。

于 2012-07-01T02:28:52.110 に答える
0
  • "a" -> 文字列であることを示します。c++ の文字列は、文字配列のコレクションです。
  • そのため、文字列は区切り文字 '\0'で終了し、文字列の終わりを示します。
  • "a" は 1 バイト、'\0' は 1 バイトであるため、サイズは 2 になります。

'a' の場合は 1 文字です。したがって、そのサイズは 1 バイトになります。

char str[]="a"; 

また

char *ptr = "c";

for  'c' -> char c = 'a';

または、同様に書くこともできます

char c = 97;
于 2014-03-16T10:53:09.243 に答える
0

一重引用符'a'は type のリテラルですchar。二重引用符"a"は、s のヌル終了文字列リテラルですchar

于 2012-07-01T02:32:18.363 に答える
-1

'a' - 1) 文字定数 2) サイズ - 1 文字 3) 文字配列のコレクションではありません

"a" -1) 文字列リテラル 2) サイズ - 2 文字 3) 文字配列のコレクション

于 2014-10-06T06:18:28.123 に答える