Aspas simples vs. as duplas em C ou C ++

208

Quando devo usar aspas simples e aspas duplas na programação C ou C ++?

Vishwanath Dalvi
fonte

Respostas:

282

Em C e em C ++, aspas simples identificam um único caractere, enquanto aspas duplas criam uma string literal. 'a'é um literal de um caractere único, enquanto "a"é um literal de cadeia de caracteres que contém um 'a'terminador e um nulo (que é uma matriz de 2 caracteres).

Em C ++, o tipo de um literal de caractere é char, mas observe que em C, o tipo de um literal de caractere é int, isto sizeof 'a'é, 4 em uma arquitetura em que as entradas são 32 bits (e CHAR_BIT é 8), enquanto sizeof(char)é 1 em qualquer lugar.

David Rodríguez - dribeas
fonte
47

Alguns compiladores também implementam uma extensão que permite constantes com vários caracteres. O padrão C99 diz:

6.4.4.4p10: "O valor de uma constante de caractere inteiro contendo mais de um caractere (por exemplo, 'ab'), ou contendo um caractere ou sequência de escape que não é mapeada para um caractere de execução de byte único, é definido pela implementação. "

Isso pode ser assim, por exemplo:

const uint32_t png_ihdr = 'IHDR';

A constante resultante (no GCC, que implementa isso) tem o valor que você obtém pegando cada caractere e alterando-o para que o 'I' acabe nos bits mais significativos do valor de 32 bits. Obviamente, você não deve confiar nisso se estiver escrevendo código independente da plataforma.

descontrair
fonte
7
Obrigado, acabei de ver isso em algum código e minha resposta só pode ser descrita como "WTF". Uso o GCC há 15 anos e nunca encontrei isso até agora.
eeeeaaii
+1 além dos cabeçalhos mágicos, geralmente usados ​​para avaliação da linha de comando.
Wolf
28

Aspas simples são caracteres ( char), as aspas duplas são seqüências terminadas em nulo ( char *).

char c = 'x';
char *s = "Hello World";
Eiko
fonte
8
"olá mundo" é um const char *.
OldSchool
@Eiko, quando você coloca um * na frente de uma variável, por exemplo, * s como acima?
CodeGuru
@CodeGuru Você usa um * quando a variável é do tipo ponteiro. Nesse caso, 's' aponta para uma matriz de caracteres.
Eiko
16
  • 'x' é um número inteiro, representando o valor numérico da letra x no conjunto de caracteres da máquina
  • "x" é uma matriz de caracteres, com dois caracteres, consistindo em ‘x’ seguido por‘\0’
mártires
fonte
2
Tarde demais;) o que é realmente novo em sua resposta - em comparação com as que já foram fornecidas?
Wolf
10

Aspas simples são para um único caractere. Aspas duplas são para uma sequência (matriz de caracteres). Você pode usar aspas simples para criar uma string, um caractere de cada vez, se desejar.

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

Eu estava bisbilhotando coisas como: int cc = 'cc'; Acontece que é basicamente uma cópia em bytes para um número inteiro. Portanto, a maneira de ver é que 'cc', que é basicamente 2 c, é copiado para diminuir 2 bytes do número inteiro cc. Se você estiver procurando por curiosidades,

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

99 25443

isso ocorre porque 25443 = 99 + 256 * 99

Portanto, 'cc' é uma constante de vários caracteres e não uma string.

Felicidades

sanket
fonte
8
  1. single quoteé para character;
  2. double quoteé para string.
bygreencn
fonte
6

Aspas duplas são para literais de string, por exemplo:

char str[] = "Hello world";

Aspas simples são para literais de um caractere, por exemplo:

char c = 'x';

EDITAR Como David afirmou em outra resposta, o tipo de um caractere literal é int.

Oliver Charlesworth
fonte
obrigado . significa que o caractere é 1 byte sem caractere nulo '/ 0' no final. string contém caractere nulo no final.
Vishwanath Dalvi
2
@mr_eclair: Uma string literal sempre contém um terminador nulo implícito, mas tenha cuidado. Você poderia escrever algo como char str[] = {'H','e','l','l','o'};, e strque não possui um terminador nulo.
Oliver Charlesworth
nessa situação, strnão é uma cadeia de caracteres (pelo menos, não é uma cadeia de estilo C, definida como NTBS).
Steve Jessop
@ Steve: Entendido. Meu ponto no @mr_eclair é que nem tudo o que é char[](do qual as pessoas costumam chamar de "strings") é nulo.
Oliver Charlesworth
1
@OliCharlesworth este é - felizmente - não toda a verdade: estes são dois strings literais separados por um comentário: "hello" /*seamlessly connected to*/ "world". E isso pode fazer sentido para mensagens multilinhas comentadas.
Lobo
6

Em C aspas simples como 'a' indicam constantes de caracteres, enquanto "a" é uma matriz de caracteres, sempre terminada com o caractere 0

Jens Gustedt
fonte
4

Aspas simples são usadas para caracteres, enquanto as aspas duplas são usadas para string.

Por exemplo..

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

Resultado

um Olá Mundo

Se você os usou no caso vice-versa e usou aspas simples para string e aspas duplas para caractere. Aqui, isso será resultado;

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

resultado :

para a primeira linha. Você terá um valor de lixo ou inesperado. ou poderá ter uma saída como esta ..

enquanto para a segunda declaração. Você não verá nada. Mais uma coisa. Se você tiver mais declarações após isso. Eles também não lhe darão resultado.

Nota: A linguagem PHP oferece flexibilidade para usar aspas simples e duplas com facilidade.

Hafiz Shehbaz Ali
fonte
3

Aspas simples estão indicando um caractere, e duas vezes uma string.

Em Java, também é o mesmo.

adiggo
fonte
2
Isso realmente não agrega valor à pergunta, pois essas informações já foram incluídas nas outras respostas.
Mike Precup
2

Use aspas simples com caracteres simples como:

char ch = 'a';

aqui 'a'é um caractere constante e é igual aoASCII valor de char a.

Use aspas duplas com cadeias de caracteres como:

char str[] = "foo";

aqui "foo" está uma string literal.

Não há problema em usar, "a"mas não em uso 'foo'

codaddict
fonte