여러 문자에 사용될 때 작은 따옴표는 C ++에서 무엇을합니까?
이 코드가 궁금합니다.
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 유형과 구현 정의 값을 갖습니다.
아니요, 주소가 아닙니다. 소위 멀티 바이트 문자입니다.
일반적으로 4 문자의 ASCII 값이 결합되어 있습니다.
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
따라서 0x74657374는 1952805748입니다.
그러나 다른 컴파일러에서는 0x74736574가 될 수도 있습니다. C 및 C ++ 표준은 모두 멀티 바이트 문자의 값이 구현 정의되어 있다고 말합니다 . 따라서 일반적으로 사용을 권장 하지 않습니다.
둘 이상의 c 문자를 포함하는 일반 문자 리터럴은 다중 문자 리터럴입니다. 다중 문자 리터럴은 int 유형과 구현 정의 값을 갖습니다.
구현 정의 동작은 구현에서 문서화해야합니다. 예를 들어 gcc에서는 여기에서 찾을 수 있습니다.
컴파일러는 한 번에 한 문자 씩 여러 문자 문자 상수를 평가하여 대상 문자 당 비트 수만큼 왼쪽으로 이전 값을 이동 한 다음 새 문자의 비트 패턴에서 대상 너비로 잘립니다. 캐릭터. 최종 비트 패턴에는 int 유형이 지정되므로 단일 문자의 서명 여부에 관계없이 서명됩니다.
자세한 내용 은 이 페이지 의 설명을 확인 하십시오.
그들은 정말로 int
s입니다. 예를 들어 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);
이 코드는 특정 엔디안에서만 작동하며 다른 컴파일러에서 작동 할 수 있습니다.
'Programing' 카테고리의 다른 글
Objective-C에서“@private”은 무엇을 의미합니까? (0) | 2020.03.23 |
---|---|
파이썬에서 체인 호출 부모 이니셜 라이저 (0) | 2020.03.23 |
Git 커밋이 아직 원점으로 푸시되지 않음 (0) | 2020.03.23 |
GitHub 리포지토리에 폴더를 만들려면 어떻게합니까? (0) | 2020.03.23 |
CSS3 투명도 + 그라디언트 (0) | 2020.03.23 |