Programing

여러 문자에 사용될 때 작은 따옴표는 C ++에서 무엇을합니까?

lottogame 2020. 3. 23. 08:02
반응형

여러 문자에 사용될 때 작은 따옴표는 C ++에서 무엇을합니까?


이 코드가 궁금합니다.

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

의 출력을 제공합니다 1952805748.

내 질문 : 출력 주소가 메모리에 있습니까?


다중 문자 리터럴입니다. 19528057480x74657374로 분해됩니다

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

편집하다:

C ++ 표준, §2.14.3 / 1-문자 리터럴

(...) 둘 이상의 c-char를 포함하는 일반 문자 리터럴은 다중 문자 리터럴입니다. 다중 문자 리터럴은 int 유형과 구현 정의 값을 갖습니다.


아니요, 주소가 아닙니다. 소위 멀티 바이트 문자입니다.

일반적으로 4 문자의 ASCII 값이 결합되어 있습니다.

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

따라서 0x74657374는 1952805748입니다.

그러나 다른 컴파일러에서는 0x74736574가 될 수도 있습니다. C 및 C ++ 표준은 모두 멀티 바이트 문자의 값이 구현 정의되어 있다고 말합니다 . 따라서 일반적으로 사용을 권장 하지 않습니다.


둘 이상의 c 문자를 포함하는 일반 문자 리터럴은 다중 문자 리터럴입니다. 다중 문자 리터럴은 int 유형과 구현 정의 값을 갖습니다.

구현 정의 동작은 구현에서 문서화해야합니다. 예를 들어 gcc에서는 여기에서 찾을 수 있습니다.

컴파일러는 한 번에 한 문자 씩 여러 문자 문자 상수를 평가하여 대상 문자 당 비트 수만큼 왼쪽으로 이전 값을 이동 한 다음 새 문자의 비트 패턴에서 대상 너비로 잘립니다. 캐릭터. 최종 비트 패턴에는 int 유형이 지정되므로 단일 문자의 서명 여부에 관계없이 서명됩니다.

자세한 내용 이 페이지 의 설명을 확인 하십시오.


그들은 정말로 ints입니다. 예를 들어 CoreAudioTypes.h헤더 파일 에서 Core Audio API 열거 형에 광범위하게 사용 됩니다.

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;
}

이런 종류의 기능은 파서를 작성할 때 정말 좋습니다. 이걸 고려하세요:

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

이 코드는 특정 엔디안에서만 작동하며 다른 컴파일러에서 작동 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters

반응형