我对这段代码感到好奇:
cout << 'test'; // Note the single quotes.
这个代码输出的是1952805748
。
我的问题是:这个输出是内存中的地址还是其他什么东西?
这是一个多字符字面量。 1952805748
是 0x74657374
,可以分解为
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
编辑:
C++标准,§2.14.3/1 - 字符字面值
(...) 包含多个c-char的普通字符字面值是多字符字面值。多字符字面值的类型为int,实现定义了其值。
sizeof(int)
也是由实现定义的。因此,存储顺序不仅是由实现定义的,而且这些的最大长度也是如此。 - bobobobo't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
所以0x74657374是1952805748。
但在其他编译器上,它也可以是0x74736574。C和C++标准都指出多字节字符的值是“实现定义的”。因此一般强烈不建议使用它。
int
是4个字节,我认为使用超过4个字节没有意义。是的,它旨在成为编写某些常量的便捷方式,但不幸的是,不同的编译器对其进行了不同的解释,因此现在大多数编码风格都不鼓励使用它。 - chys==
应该可以检查通过。 - bobobobo它们实际上只是 int
。例如,在核心音频API枚举中,它们被广泛使用,例如在CoreAudioTypes.h
头文件中。
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
有人说这不是"平台独立"的,但当你使用一个为特定平台设计的API时,谁会在意可移植性呢?在同一平台上检查相等将永远不会失败。这些使用 enum
枚举的值更易读,并且它们实际上包含了 它们的值中的身份信息,这非常好。
下面我尝试将多字节字符文字包装起来以便能够打印出来(在 Mac 上运行正常)。奇怪的是,如果您没有使用完所有四个字符,则下面的结果会变得不正确。
#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;
}
$HOME
始终存储以 /Users/
开头的值。如果库总是与其依赖项同时编译,那么这不是一个可怕的想法(只是一个糟糕的想法),但二进制格式会持续存在,有人会对其产生依赖,这是一场等待发生的噩梦。 - MooseBoys当您正在构建解析器时,这种功能非常好。考虑以下内容:
byte* buffer = ...;
if(*(int*)buffer == 'GET ')
invoke_get_method(buffer+4);