提问人:lucidreality 提问时间:9/18/2011 最后编辑:Tamara Wijsmanlucidreality 更新时间:7/6/2017 访问量:20946
当用于多个字符时,单引号在 C++ 中有什么作用?
What do single quotes do in C++ when used on multiple characters?
问:
我对这段代码很好奇:
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 和 implementation-defined 价值。
评论
sizeof(int)
不,它不是地址。这就是所谓的多字节字符。
通常,它是四个字符组合的 ASCII 值。
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
所以0x74657374 1952805748。
但它也可以在其他编译器上0x74736574。C 和 C++ 标准都说多字节字符的值是实现定义的。因此,通常强烈建议不要使用它。
评论
int
==
包含多个 c-char 的普通字符文本是多字符文本。多字符文本具有类型 int 和实现定义的值。
实现定义的行为需要记录在 实施。例如,在 GCC 中,您可以在此处找到它
编译器对多字符字符常量进行值 一次一个字符,将前一个值向左移动 按每个目标字符的位数,然后 在新字符的位模式中被截断的 or-ing 设置为目标字符的宽度。决赛 bit-pattern 的类型为 int,因此是有符号的, 无论单个字符是否带符号或 不。
查看此页面中的说明以获取更多详细信息
他们真的只是s。它们在 Core Audio API 枚举中被广泛使用,例如,在头文件中,int
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;
}
评论
$HOME
/Users/
当你在构建解析器时,这种功能真的很好。 考虑一下:
byte* buffer = ...;
if(*(int*)buffer == 'GET ')
invoke_get_method(buffer+4);
此代码可能仅适用于特定的 endianess,并且可能会跨不同的编译器中断
评论