[C++]Multicharacter literals
※ 주의 ※ 작성된 지 오래된 글입니다(2016.6)이전 블로그에서 작성했던 글을 재가공한 것입니다. 출처는 하단에 표기했습니다.
흔히 C언어에서 문자와 문자열에 대해 배울 때, 작은 따옴표( ‘ ‘ )는 문자를 나타내고, 큰 따옴표( “ “ )는 문자열을 나타낸다고 배운다. 그리고 그에 맞게 표기하지 않으면(작은 따옴표에 문자열을 넣는다거나) 잘못된 코드이고, 에러가 나는게 당연하다고 여겼다.
그런데 VC++ 2013 커뮤니티 버젼을 쓰던 중, 저런 잘못을 했는데… 에러가 나지 않더라. 그래서 해당 내용을 조사해보니, 새로운 내용을 발견할 수 있었다.
Microsoft Docs - 문자열 및 문자 리터럴(c++)
해당 문서의 예제 코드중에 이런 부분이 있다.
// Multicharacter literals
auto m0 = 'abcd'; // int, value 0x61626364
해당 코드가 실행되면 10진수로 1633837924가 출력되고, 이는 16진수로 0x61626364이다. 이를 4개로 쪼개면, 0x61, 0x62, 0x63, 0x64이고, 이들 각각을 아스키 코드로 변환해보면 다음과 같이 나온다.
16진수 | 문자 |
---|---|
0x61 | ‘a’ |
0x62 | ‘b’ |
0x63 | ‘c’ |
0x64 | ‘d’ |
이렇게 작은 따옴표 사이에 char가 여러개 들어간 것을 multicharacter literal이라고 하고, int 타입으로 들어간다고 한다.
그런데 C++ 표준 파일에서는, 그 값이 implementation-defined value
를 가진다고 한다. 이 말은 컴파일러마다 다른 값을 가질 수 있다는 것을 의미한다고 한다. 즉, 저 코드도 특정 컴파일러에서만 저렇게 작동한다는 것을 의미한다.
컴파일러마다 다른 값을 가질 수 있는 기능이니, 웬만하면 사용하지 않는게 좋을 것 같다.
Leave a comment