在多个字符上使用C ++时,单引号会做什么?
我很好奇这个代码:
cout << 'test'; // Note the single quotes.
给了我1952805748
的输出。
我的问题:输出是在内存或地址的地址?
这是一个多字符文字。 1952805748
是0x74657374
,分解为
0x74 -> 't' 0x65 -> 'e' 0x73 -> 's' 0x74 -> 't'
编辑:
C ++标准§2.14.3/ 1 – 字符文字
(…)包含多个c-char的普通字符文字是多字符文字。 多字符文字具有typesint和实现定义的值。
不,这不是一个地址。 这就是所谓的多字节字符。
通常,这是四个字符组合的ASCII值。
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
所以0x74657374是1952805748。
但是在其他编译器上也可以是0x74736574。 C和C ++标准都说多字节字符的值是实现定义的 。 所以一般来说,它的使用是强烈的不鼓励。
包含多个c-char的普通字符文字是多字符文字。 多字符文字具有typesint和实现定义的值。
实现定义的行为需要由实现logging。 例如在gcc中,你可以在这里find它
编译器每次对一个字符的多字符字符常量进行赋值,将前一个值左移每个目标字符的位数,然后将新字符的位模式截断为目标的宽度字符。 最终的位模式是inttypes的,因此被签名,无论单个字符是否被签名。
查看此页面中的解释以获取更多详细信息
他们真的只是int
。 它们广泛用于Core Audio API枚举中,例如CoreAudioTypes.h
头文件中,
enum { kAudioFormatLinearPCM = 'lpcm', kAudioFormatAC3 = 'ac-3', kAudioFormat60958AC3 = 'cac3', kAudioFormatAppleIMA4 = 'ima4', kAudioFormatMPEG4AAC = 'aac ', kAudioFormatMPEG4CELP = 'celp', } ;
关于这个不是“独立于平台”的讨论有很多,但是当你使用一个针对特定平台的api时,谁会关心可移植性。 在同一平台上检查相等性将永远不会失败。 这些enum
值更容易阅读,并且实际上将它们的身份包含在它们的值中 ,这相当不错。
我在下面试过的是将一个多字节字符文字包装起来,这样就可以打印(在Mac上可以使用)。 奇怪的是,如果你没有用完所有4个字符,结果就会变成下面的错误。
#include <stdio.h> #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; }
当您构buildparsing器时,这种function非常好。 考虑这个:
byte* buffer = ...; if(*(int*)buffer == 'GET ') invoke_get_method(buffer+4);
这段代码可能只适用于特定的endianess,并可能跨越不同的编译器