Virgolette singole vs. doppie virgolette in C o C ++


Risposte:


282

In C e in C ++ le virgolette singole identificano un singolo carattere, mentre le virgolette doppie creano una stringa letterale. 'a'è un singolo un carattere letterale, mentre "a"è un letterale stringa contenente un 'a'e un terminatore null (ovvero un array di 2 caratteri).

In C ++ il tipo di carattere è letterale char, ma si noti che in C il tipo di carattere è letterale int, ovvero sizeof 'a'4 in un'architettura in cui gli ints sono 32 bit (e CHAR_BIT è 8), mentre sizeof(char)1 è ovunque.


47

Alcuni compilatori implementano anche un'estensione, che consente costanti multi-carattere. Lo standard C99 dice:

6.4.4.4p10: "Il valore di una costante di carattere intero contenente più di un carattere (ad es. 'Ab') o contenente un carattere o una sequenza di escape che non si associa a un carattere di esecuzione a byte singolo, è definito dall'implementazione. "

Potrebbe apparire così, ad esempio:

const uint32_t png_ihdr = 'IHDR';

La costante risultante (in GCC, che implementa questo) ha il valore che ottieni prendendo ogni carattere e spostandolo in alto, in modo che "I" finisca nei bit più significativi del valore a 32 bit. Ovviamente, non dovresti fare affidamento su questo se stai scrivendo codice indipendente dalla piattaforma.


7
Grazie, l'ho appena visto in alcuni codici e la mia risposta può essere descritta solo come "WTF". Ho usato GCC on e off per 15 anni e non ho mai incontrato una volta fino ad ora.
eeeeaaii,

+1 oltre alle intestazioni magiche, spesso utilizzate per la valutazione della riga di comando.
Lupo,

28

Le virgolette singole sono caratteri ( char), le virgolette doppie sono stringhe con terminazione null ( char *).

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

8
"ciao mondo" è un const char *.
OldSchool,

@Eiko quando metti un * infront di una variabile, ad esempio * s come sopra?
CodeGuru

@CodeGuru Si utilizza un * quando la variabile è di tipo puntatore. In questo caso, 's' indica una matrice di caratteri.
Eiko,

16
  • 'x' è un numero intero, che rappresenta il valore numerico della lettera x nel set di caratteri della macchina
  • "x"è una matrice di caratteri, lunga due caratteri, composta da ‘x’seguita da‘\0’

2
Abbastanza tardi;) cosa c'è di veramente nuovo nella tua risposta - rispetto a quelli già indicati?
Lupo,

10

Le virgolette singole sono per un singolo carattere. Le virgolette doppie sono per una stringa (matrice di caratteri). Puoi usare virgolette singole per creare una stringa di un carattere alla volta, se lo desideri.

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

10

Stavo cercando cose come: int cc = 'cc'; Succede che in pratica è una copia in byte di un intero. Quindi il modo di vederlo è che 'cc' che è fondamentalmente 2 c viene copiato in 2 byte inferiori dell'intero cc. Se stai cercando una curiosità, allora

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

99 25443

questo perché 25443 = 99 + 256 * 99

Quindi 'cc' è una costante multi-carattere e non una stringa.

Saluti


8
  1. single quoteè per character;
  2. double quoteè per string.

6

Le virgolette doppie sono per valori letterali stringa, ad esempio:

char str[] = "Hello world";

Le virgolette singole sono per letterali a carattere singolo, ad es .:

char c = 'x';

EDIT Come ha affermato David in un'altra risposta, il tipo di un personaggio è letterale int.


Grazie . significa che il carattere è 1 byte senza carattere nullo '/ 0' alla fine .. la stringa contiene un carattere nullo alla fine.
Vishwanath Dalvi,

2
@mr_eclair: una stringa letterale contiene sempre un terminatore null implicito, ma fai attenzione. Potresti scrivere qualcosa del genere char str[] = {'H','e','l','l','o'};e nonstr avresti un terminatore nullo.
Oliver Charlesworth,

in quella situazione, strnon è una stringa (almeno, non una stringa in stile C, definita come NTBS).
Steve Jessop,

@Steve: capito. Il mio punto su @mr_eclair era che non tutto ciò che è char[](che la gente spesso definisce "stringhe") ha una terminazione nulla.
Oliver Charlesworth,

1
@OliCharlesworth questo è - per fortuna - non tutta la verità: sono due stringhe separate da un commento: "hello" /*seamlessly connected to*/ "world". E questo può avere senso per i messaggi multilinea commentati.
Lupo,

6

In C virgolette singole come 'a' indicano costanti di caratteri mentre "a" è un array di caratteri, sempre terminato con il carattere 0


4

La virgoletta singola viene utilizzata per il carattere, mentre la virgoletta doppia viene utilizzata per la stringa.

Per esempio..

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

Produzione

un mondo Ciao

Se li hai usati viceversa e hai usato virgolette singole per stringa e virgolette doppie per carattere. Qui, questo sarà il risultato;

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

produzione :

per la prima riga. Avrai un valore di Garbage o imprevisto. O potresti avere un output come questo ..

mentre per la seconda affermazione. Non vedrai nulla. Ancora una cosa. Se hai più dichiarazioni dopo questo. Inoltre non ti daranno alcun risultato.

Nota: il linguaggio PHP ti dà la flessibilità di usare facilmente virgolette singole e doppie.


3

Le virgolette singole indicano un carattere, il doppio indica una stringa.

In Java, è anche lo stesso.


2
Questo in realtà non aggiunge alcun valore alla domanda, poiché questa informazione è già stata racchiusa nelle altre risposte.
Mike Precup,

2

Usa virgoletta singola con carattere singolo come:

char ch = 'a';

qui 'a'è una costante char ed è uguale al ASCIIvalore di char a.

Usa la virgoletta doppia con le stringhe come:

char str[] = "foo";

ecco "foo"una stringa letterale.

Va bene usare "a"ma non va bene usare "foo'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.