CまたはC ++での単一引用符と二重引用符


回答:


282

CおよびC ++では、単一引用符は単一の文字を識別し、二重引用符は文字列リテラルを作成します。'a'は単一の"a"文字リテラルですが、'a'とnullターミネータ(2文字の配列)を含む文字列リテラルです。

C ++では、文字リテラルのタイプはですが、Cでは、文字リテラルcharのタイプはですint。つまりsizeof 'a'、intが32ビット(およびCHAR_BITが8)のアーキテクチャでは4であり、sizeof(char)どこでも1です。


47

一部のコンパイラは、複数文字定数を許可する拡張機能も実装しています。C99標準は言う:

6.4.4.4p10:「複数の文字( 'ab'など)を含む、または1バイトの実行文字にマップされない文字またはエスケープシーケンスを含む整数文字定数の値は、実装定義です。 」

たとえば、次のようになります。

const uint32_t png_ihdr = 'IHDR';

結果の定数(これを実装するGCC内)は、各文字を取得して上にシフトすることによって取得する値を持ち、「I」は32ビット値の最上位ビットになります。明らかに、プラットフォームに依存しないコードを書いているなら、これに依存すべきではありません。


7
おかげで、私はこれをいくつかのコードで見ただけで、私の応答は「WTF」としか記述できません。私は15年間GCCをオン/オフしてきましたが、これまで一度もこれに遭遇したことはありません。
eeeeaaii 2012年

マジックヘッダーのほかに+1。コマンドラインの評価によく使用されます。
Wolf

28

一重引用符は文字(char)であり、二重引用符はnullで終了する文字列(char *)です。

char c = 'x';
char *s = "Hello World";

8
「ハローワールド」はconst char *です。
OldSchool 2015

@Eikoいつ*を変数の前に置くのですか?例えば上記の* sですか?
CodeGuru、2015年

@CodeGuru変数がポインタ型の場合、*を使用します。この場合、「s」は文字の配列を指します。
Eiko

16
  • 'x' マシンの文字セット内の文字xの数値を表す整数です
  • "x"文字の配列からなる、2文字の長さで‘x’続きます‘\0’

2
かなり遅い;)あなたの答えで本当に新しいものは何ですか?
Wolf

10

単一引用符は単一の文字を表します。二重引用符は文字列(文字の配列)用です。必要に応じて、一重引用符を使用して、一度に1文字ずつ文字列を作成できます。

char myChar     = 'A';
char myString[] = "Hello Mum";
char myOtherString[] = { 'H','e','l','l','o','\0' };

10

私は次のようなものを探していました:int cc = 'cc'; それは基本的に整数へのバイト単位のコピーです。したがって、それを見る方法は、基本的に2つのcである「cc」が整数ccの下位2バイトにコピーされることです。雑学を探しているなら

printf("%d %d", 'c', 'cc'); would give:

99 25443

25443 = 99 + 256 * 99だからです

したがって、 'cc'は文字列ではなく複数文字の定数です。

乾杯


8
  1. single quoteのためcharacterです;
  2. double quoteのためstringです。

6

二重引用符は文字列リテラル用です。例:

char str[] = "Hello world";

単一引用符は単一文字リテラル用です。例:

char c = 'x';

編集 Davidが別の回答で述べたように、文字リテラルのタイプはintです。


感謝します。文字が1バイトで、末尾にヌル文字 '/ 0'がないことを意味します。文字列の最後にヌル文字が含まれています。
Vishwanath Dalvi

2
@mr_eclair:文字列リテラルには常に暗黙のnullターミネータが含まれますが、注意してください。あなたのような何かを書くことができchar str[] = {'H','e','l','l','o'};、かつstrしまうではないヌルターミネータを持っています。
オリバーチャールズワース

その状況でstrは、は文字列ではありません(少なくとも、NTBSとして定義されているCスタイルの文字列ではありません)。
Steve Jessop、

@Steve:わかりました。@mr_eclairへの私の指摘は、char[](文字列と呼ばれることの多い)すべてがnullで終了するわけではないということでした。
オリバーチャールズワース2010

1
@OliCharlesworthこれは-幸いなことに-完全な真実ではありません。これらはコメントで区切られた2つの文字列リテラルです"hello" /*seamlessly connected to*/ "world"。そして、これはコメントされた複数行のメッセージにとって意味があります。
Wolf


4

文字には一重引用符が使用され、文字列には二重引用符が使用されます。

例えば..

 printf("%c \n",'a');
 printf("%s","Hello World");

出力

ハローワールド

これらを逆に使用し、文字列に一重引用符を使用し、文字に二重引用符を使用した場合。ここでは、これが結果になります。

  printf("%c \n","a");
  printf("%s",'Hello World');

出力:

最初の行に。ガベージ値または予期しない値が含まれます。または、次のような出力が表示される場合があります。

一方、2番目のステートメント。何も表示されません。もう一つ。この後さらに説明がある場合。彼らはまたあなたに結果を与えません。

注:PHP言語では、単一引用符と二重引用符を簡単に使用できる柔軟性が得られます。


3

一重引用符は文字を表し、二重引用符は文字列を表します。

Javaでも同じです。


2
この情報はすでに他の回答に含まれているため、これは実際には質問に値を追加しません。
Mike Precup、2014

2

次のように、単一引用符と単一文字を使用します。

char ch = 'a';

ここに'a'char定数がありASCII、char aの値と同じです。

次のように文字列で二重引用符を使用します。

char str[] = "foo";

これ"foo"は文字列リテラルです。

その使用"a"は大丈夫ですが、使用は大丈夫ではありません 'foo'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.