C++ 单引号在C++;当用于多个字符时?

C++ 单引号在C++;当用于多个字符时?,c++,quotes,C++,Quotes,我对这段代码很好奇: cout << 'test'; // Note the single quotes. cout这是一个多字符文本1952805748是0x74657374,分解为 0x74 -> 't' 0x65 -> 'e' 0x73 -> 's' 0x74 -> 't' 编辑: C++标准,§2.14.3/1-字符文本 (…)包含多个字符的普通字符文字 一个c字符是多字符文字。多字符文字定义了类型int和实现 价值观 不,不是地址。这就是所谓的多

我对这段代码很好奇:

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

cout这是一个多字符文本
1952805748
0x74657374
,分解为

0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
编辑:

C++标准,§2.14.3/1-字符文本

(…)包含多个字符的普通字符文字 一个c字符是多字符文字。多字符文字定义了类型int和实现 价值观


不,不是地址。这就是所谓的多字节字符

通常,这是四个字符组合的ASCII值

't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74; 
所以0x74657374是1952805748

但在其他编译器上也可以是0x74736574。C和C++标准都表示多字节字符的值是定义的实现。因此,一般强烈反对使用它

包含多个c字符的普通字符文字是多字符文字。多字符文字具有类型int和实现定义的值

实施定义的行为需要由以下人员记录: 实施。例如,在gcc中,您可以找到它

编译器为多字符常量赋值 一次一个字符,将上一个值向左移动 按每个目标字符的位数,然后 或在被截断的新字符的位模式中进行加密 到目标字符的宽度。决赛 位模式为int类型,因此有符号, 无论单个字符是有符号的还是 不是


查看中的解释了解更多详细信息

它们实际上只是
int
s。它们在核心音频API枚举中广泛使用,例如,在
CoreAudioTypes.h
头文件中

enum
{
    kAudioFormatLinearPCM               = 'lpcm',
    kAudioFormatAC3                     = 'ac-3',
    kAudioFormat60958AC3                = 'cac3',
    kAudioFormatAppleIMA4               = 'ima4',
    kAudioFormatMPEG4AAC                = 'aac ',
    kAudioFormatMPEG4CELP               = 'celp',
} ;
有很多人说这不是“平台独立”,但当你使用为特定平台制作的api时,谁会关心可移植性呢。在同一平台上检查平等性永远不会失败。这些
enum
'd值更易于读取,并且它们实际上在值中包含了它们的标识,这非常好

我在下面尝试做的是将一个多字节字符文字包装起来,这样它就可以打印出来(在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;
}
#包括
#定义掩码(x,BYTEX)((x&(0xff(8*BYTEX))
结构多字节
{
联合{
int-val;
char-vals[4];
};
多字节():val(0){}
多字节(int-in)
{
VAL[0]=掩模(in,3);
VAL[1]=掩模(in,2);
VAL[2]=掩模(in,1);
VAL[3]=掩模(英寸,0);
}
字符运算符[](int i){
return val>>(3-i)*8;//在mac上工作
//return val>>i*8;//可能适用于其他系统
}
void println()
{
对于(int i=0;i<4;i++)
putc(vals[i],stdout);
认沽权(“”);
}
} ;
int main(int argc,const char*argv[]
{
多字节('abcd')。println();
多字节('x097')。println();
多字节('\'\''\'').println();
多字节('/*|')。println();
多字节('d').println();
返回0;
}

当您构建解析器时,这种功能非常好。 考虑这一点:

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

此代码可能只适用于特定的尾数,并且可能会在不同的编译器之间发生冲突

请注意,实际值是实现定义的,即这种多字节字符的长度限制为4字节?即,它是否表示以字符形式写出的整数?@Giorgio:标准仅说明其实现定义d、 没有更多细节。实际上,由于大多数机器上的
int
是4字节,我认为使用超过4字节是没有意义的。是的,它是用来方便地编写一些常量的,但不幸的是,不同的编译器对它的解释不同,所以现在大多数编码样式都不鼓励使用它。@chys:a事实上,它的实现已经定义,这意味着它甚至不需要一致性。例如,一致性编译器可以将所有多字符文本的值设置为0(尽管这是不友好的)。有人不得不问,为什么标准中存在这种疯狂的功能。它似乎是一个罕见的用例,无论如何都是实现定义的,如果需要的话,可以通过普通的位移位和或“ing”非常清楚地完成。@Boann是的,我的看法正是如此。但是你可以安全地将它用于开关等等,作为
=
的直接比较您没有提到这是由实现定义的。我认为该定义最有趣的一点是,
sizeof(int)
也是由实现定义的。因此,不仅定义了存储顺序实现,还定义了它们的最大长度。“在同一平台上检查相等性永远不会失败。”。“可能吧。升级到Visual Studio xyz并咬住你的舌头。这个库做出了一个糟糕的决定。@LightnessRacesinOrbit”升级到Visual Studio xyz并咬住你的舌头。“核心音频API是OS X的系统音频API,所以这不相关。@Jean-MichaëlCelerier:好;升级你的OSX铿锵版本并咬住你的舌头。。。