Einfache Anführungszeichen gegen doppelte Anführungszeichen in C oder C ++


Antworten:


282

In C und in C ++ identifizieren einfache Anführungszeichen ein einzelnes Zeichen, während doppelte Anführungszeichen ein Zeichenfolgenliteral erstellen. 'a'ist ein einzelnes Zeichenliteral, während "a"ein Zeichenfolgenliteral ein 'a'und ein Null-Terminator enthält (dh ein 2-Zeichen-Array).

In C ++ ist der Typ eines Zeichenliteral char, aber beachten Sie, dass in C der Typ eines Zeichenliteral 4 ist int, sizeof 'a'dh 4 in einer Architektur, in der Ints 32 Bit (und CHAR_BIT 8) sind, während sizeof(char)überall 1 ist.


47

Einige Compiler implementieren auch eine Erweiterung, die Konstanten mit mehreren Zeichen zulässt. Der C99-Standard sagt:

6.4.4.4p10: "Der Wert einer Ganzzahlzeichenkonstante, die mehr als ein Zeichen enthält (z. B. 'ab') oder ein Zeichen oder eine Escape-Sequenz enthält, die keinem Einzelbyte-Ausführungszeichen zugeordnet ist, ist implementierungsdefiniert. ""

Dies könnte zum Beispiel so aussehen:

const uint32_t png_ihdr = 'IHDR';

Die resultierende Konstante (in GCC, das dies implementiert) hat den Wert, den Sie erhalten, wenn Sie jedes Zeichen nehmen und nach oben verschieben, sodass 'I' in den höchstwertigen Bits des 32-Bit-Werts endet. Natürlich sollten Sie sich nicht darauf verlassen, wenn Sie plattformunabhängigen Code schreiben.


7
Danke, ich habe das gerade in einem Code gesehen und meine Antwort kann nur als "WTF" beschrieben werden. Ich benutze GCC seit 15 Jahren ein und aus und bin bisher noch nie darauf gestoßen.
Eeeeaaii

+1 neben magischen Headern, die häufig für die Befehlszeilenauswertung verwendet werden.
Wolf

28

Einfache Anführungszeichen sind Zeichen ( char), doppelte Anführungszeichen sind nullterminierte Zeichenfolgen ( char *).

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

8
"Hallo Welt" ist ein const char *.
OldSchool

@Eiko wann stellst du ein * vor eine Variable, zB * s wie oben?
CodeGuru

@CodeGuru Sie verwenden ein *, wenn die Variable ein Zeigertyp ist. In diesem Fall zeigt 's' auf ein Array von Zeichen.
Eiko

16
  • 'x' ist eine Ganzzahl, die den numerischen Wert des Buchstabens x im Zeichensatz der Maschine darstellt
  • "x"ist ein Array von Zeichen, zwei Zeichen lang, bestehend aus ‘x’gefolgt von‘\0’

2
Ganz spät;) Was ist wirklich neu in deiner Antwort - verglichen mit den bereits gegebenen?
Wolf

10

Einfache Anführungszeichen stehen für ein einzelnes Zeichen. Doppelte Anführungszeichen stehen für eine Zeichenfolge (Zeichenarray). Sie können einfache Anführungszeichen verwenden, um eine Zeichenfolge zeichenweise aufzubauen, wenn Sie möchten.

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

10

Ich stöberte in Sachen herum wie: int cc = 'cc'; Es kommt vor, dass es sich im Grunde um eine byteweise Kopie in eine Ganzzahl handelt. Daher ist die Art und Weise, wie man es betrachtet, dass 'cc', was im Grunde genommen 2 cs sind, in niedrigere 2 Bytes der Ganzzahl cc kopiert wird. Wenn Sie nach einer Kleinigkeit suchen, dann

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

99 25443

Das liegt daran, dass 25443 = 99 + 256 * 99

'Cc' ist also eine Konstante mit mehreren Zeichen und keine Zeichenfolge.

Prost


8
  1. single quoteist für character;
  2. double quoteist für string.

6

Doppelte Anführungszeichen stehen für Zeichenfolgenliterale, z.

char str[] = "Hello world";

Einfache Anführungszeichen stehen für einzelne Zeichenliterale, z.

char c = 'x';

BEARBEITEN Wie David in einer anderen Antwort feststellte, ist der Typ eines Zeichenliteral int.


Vielen Dank . bedeutet, dass das Zeichen 1 Byte ohne Nullzeichen '/ 0'am Ende ist. Die Zeichenfolge enthält am Ende ein Nullzeichen.
Vishwanath Dalvi

2
@mr_eclair: Ein String- Literal enthält immer einen impliziten Null-Terminator, aber seien Sie vorsichtig. Sie könnten so etwas schreiben char str[] = {'H','e','l','l','o'};und strhätten keinen Null-Terminator.
Oliver Charlesworth

In dieser Situation strhandelt es sich nicht um eine Zeichenfolge (zumindest nicht um eine Zeichenfolge im C-Stil, die als NTBS definiert ist).
Steve Jessop

@Steve: Verstanden. Mein Punkt an @mr_eclair war, dass nicht alles, was ein ist char[](was die Leute oft als "Strings" bezeichnen), nullterminiert ist.
Oliver Charlesworth

1
@OliCharlesworth das ist - zum Glück - nicht die volle Wahrheit: Dies sind zwei String-Literale, die durch einen Kommentar getrennt sind : "hello" /*seamlessly connected to*/ "world". Dies kann für kommentierte mehrzeilige Nachrichten sinnvoll sein.
Wolf

6

In C geben einfache Anführungszeichen wie 'a' Zeichenkonstanten an, während "a" ein Array von Zeichen ist, das immer mit dem Zeichen 0 abgeschlossen wird


4

Ein einfaches Anführungszeichen wird für Zeichen verwendet, während ein doppeltes Anführungszeichen für Zeichenfolgen verwendet wird.

Beispielsweise..

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

Ausgabe

eine Hallo Welt

Wenn Sie diese im umgekehrten Fall verwendet und ein einfaches Anführungszeichen für eine Zeichenfolge und ein doppeltes Anführungszeichen für ein Zeichen verwendet haben. Hier wird dies das Ergebnis sein;

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

Ausgabe :

für die erste Zeile. Sie haben Müllwert oder unerwartet. Oder Sie haben möglicherweise eine Ausgabe wie diese.

während für die zweite Aussage. Du wirst nichts sehen. Eins noch. Wenn Sie danach mehr Aussage haben. Sie werden Ihnen auch kein Ergebnis geben.

Hinweis: Die PHP-Sprache bietet Ihnen Flexibilität bei der einfachen Verwendung von einfachen und doppelten Anführungszeichen.


3

Einfache Anführungszeichen bezeichnen ein Zeichen, doppelte Anführungszeichen eine Zeichenfolge.

In Java ist es auch dasselbe.


2
Dies fügt der Frage keinen wirklichen Wert hinzu, da diese Informationen bereits in den anderen Antworten enthalten sind.
Mike Precup

2

Verwenden Sie ein einfaches Anführungszeichen mit einem einfachen Zeichen als:

char ch = 'a';

Hier 'a'ist eine Zeichenkonstante und gleich dem ASCIIWert von Zeichen a.

Verwenden Sie doppelte Anführungszeichen mit Zeichenfolgen als:

char str[] = "foo";

Hier "foo"ist ein String-Literal.

Es ist in Ordnung zu benutzen, "a"aber es ist nicht in Ordnung zu benutzen. 'foo'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.