在多个字符上使用C ++时,单引号有什么作用?

时间:2011-09-18 06:44:12

标签: c++ quotes

我对这段代码感到好奇:

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

给我输出1952805748

我的问题:输出是内存中的地址还是什么?

5 个答案:

答案 0 :(得分:282)

这是一个多字符文字。 19528057480x74657374,其分解为

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

修改

  

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

     

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

答案 1 :(得分:73)

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

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

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

所以0x74657374是1952805748。

但在某些其他编译器上它也可能是0x74736574。 C和C ++标准都说多字节字符的值是实现定义。因此,一般来说,强烈不鼓励使用它。

答案 2 :(得分:17)

  

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

需要记录实现定义的行为 实施。例如,在gcc中,您可以找到它here

编译器指定多字符字符常量 一次一个角色,左移前一个值 通过每个目标字符的位数,然后 或者截取新字符的位模式 到目标角色的宽度。决赛 bit-pattern的类型为int,因此被签名, 无论单个字符是否已签名或 不。

查看this page中的说明了解详情

答案 3 :(得分:10)

他们真的只是int。它们在Core Audio 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;
}

答案 4 :(得分:1)

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

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

此代码可能仅适用于特定的字节序,可能会破坏不同的编译器