O que aspas simples fazem em C ++ quando usadas em vários caracteres?

Estou curioso sobre este código:

cout << 'test'; // Note the single quotes. 

me dá uma saída de 1952805748 .

Minha pergunta: a saída é um endereço na memory ou algo assim?

É um literal de vários caracteres. 1952805748 é 0x74657374 , que se decompõe como

 0x74 -> 't' 0x65 -> 'e' 0x73 -> 's' 0x74 -> 't' 

Editar:

Padrão C ++, §2.14.3 / 1 – Literais de caracteres

(…) Um literal de caractere comum que contém mais de um c-char é um literal multicharacter. Um literal multicharacter possui tipo int e valor definido pela implementação.

Não, não é um endereço. É o chamado personagem multibyte.

Normalmente, são os valores ASCII dos quatro caracteres combinados.

 't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74; 

Então 0x74657374 é 1952805748.

Mas também pode ser 0x74736574 em algum outro compilador. Os padrões C e C ++ dizem que o valor de caracteres multibyte é definido pela implementação . Então, geralmente, seu uso é fortemente desencorajado.

Um literal de caractere comum que contém mais de um c-char é um literal multicharacter. Um literal multicharacter possui tipo int e valor definido pela implementação.

O comportamento definido pela implementação deve ser documentado pela implementação. por exemplo, no gcc você pode encontrá-lo aqui

O compilador valoriza uma constante de caractere com vários caracteres, um caractere por vez, alterando o valor anterior deixado pelo número de bits por caractere de destino e, em seguida, or-ing no padrão de bits do novo caractere truncado para a largura de um destino personagem. O padrão de bits final recebe o tipo int e, portanto, é assinado, independentemente de os caracteres únicos serem assinados ou não.

Confira a explicação nesta página para mais detalhes

Eles são realmente apenas int . Eles são usados ​​extensivamente no enum da API do Core Audio, por exemplo, no arquivo de header CoreAudioTypes.h ,

 enum { kAudioFormatLinearPCM = 'lpcm', kAudioFormatAC3 = 'ac-3', kAudioFormat60958AC3 = 'cac3', kAudioFormatAppleIMA4 = 'ima4', kAudioFormatMPEG4AAC = 'aac ', kAudioFormatMPEG4CELP = 'celp', } ; 

Há muita conversa sobre isso não ser “independente de plataforma”, mas quando você está usando uma API feita para uma plataforma específica, quem se importa com a portabilidade. Verificar a igualdade na mesma plataforma nunca falhará. Esses valores enum ‘d são mais fáceis de ler e eles realmente contêm sua identidade em seu valor , o que é muito bom.

O que eu tentei fazer abaixo é envolver um literal de caracteres multibyte para que possa ser impresso (no Mac isso funciona). O estranho é que, se você não usar todos os 4 caracteres, o resultado se torna errado abaixo.

 #include  #define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX)) struct Multibyte { union{ int val ; char vals[4]; }; Multibyte() : val(0) { } Multibyte( int in ) { vals[0] = MASK(in,3); vals[1] = MASK(in,2); vals[2] = MASK(in,1); vals[3] = MASK(in,0); } char operator[]( int i ) { return val >> (3-i)*8 ; // works on mac //return val>>i*8 ; // might work on other systems } void println() { for( int i = 0 ; i < 4 ; i++ ) putc( vals[i], stdout ) ; puts( "" ) ; } } ; int main(int argc, const char * argv[]) { Multibyte( 'abcd' ).println() ; Multibyte( 'x097' ).println() ; Multibyte( '\"\\\'\'' ).println() ; Multibyte( '/*|' ).println() ; Multibyte( 'd' ).println() ; return 0; } 

Esse tipo de recurso é muito bom quando você está construindo analisadores. Considere isto:

 byte* buffer = ...; if(*(int*)buffer == 'GET ') invoke_get_method(buffer+4); 

Este código provavelmente só funcionará em endianess específicos e poderá quebrar diferentes compiladores