programing

C/C++에서 "\"?가 이스케이프 시퀀스인 이유는 무엇입니까?

newsource 2023. 6. 14. 21:52

C/C++에서 "\"?가 이스케이프 시퀀스인 이유는 무엇입니까?

C/C++에서 이스케이프해야 하는 특수 비알파벳 문자가 4개 있습니다. 하나의 따옴표\'이중 따옴표\"백슬래시\\물음표\?그것은 분명히 그들이 특별한 의미를 가지고 있기 때문입니다. '독신으로char,"문자열 리터럴의 경우,\탈출 시퀀스를 위해, 하지만 왜??그들 중 한명?

오늘 교과서에서 탈출 순서표를 읽었는데 탈출한 적이 없다는 걸 깨달았어요?문제가 발생한 적이 없습니다.만약을 위해 GCC에서 테스트했습니다.

#include <stdio.h>
int main(void)
{
    printf("question mark ? and escaped \?\n");
    return 0;
}

그리고 C++ 버전:

#include <iostream>
int main(void)
{
    std::cout << "question mark ? and escaped \?" << std::endl;
    return 0;
}

두 프로그램 모두 출력:question mark ? and escaped ?

그래서 두 가지 질문이 있습니다.

  1. 이유는\?탈출 시퀀스 캐릭터 중 하나?
  2. 탈출이 불가능한 이유?잘 작동합니까?경고조차 없습니다.

더 흥미로운 사실은 탈옥자들이\?와 동일하게 사용할 수 있습니다.?일부 다른 언어로도.Lua/Ruby에서 테스트를 해봤는데, 문서화되어 있지는 않았지만 사실입니다.

이유는\?탈출 시퀀스 캐릭터 중 하나?

특별하기 때문입니다.답은 Trigraph로 이어지고, C/C++ 전처리기는 다음의 세 개의 문자 시퀀스를 해당하는 단일 문자로 바꿉니다(C11 §5.2.1.1 및 C++11 §2.3).

Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
Replacement:      [    ]    {    }    #    \    ^    |    ~

삼각형은 현재 거의 쓸모가 없으며 주로 난독화 목적으로 사용됩니다.IOCC에서 몇 가지 예를 볼 수 있습니다.

GCC는 기본적으로 삼각형을 지원하지 않으며 옵션이 없는 한 코드에 삼각형이 있으면 경고합니다.-trigraphs3이 활성화됩니다.아래에-trigraphs옵션, 두 번째\?는 다음 예에서 유용합니다.

printf("\?\?!\n");

출력은 다음과 같습니다.|한다면?탈출할 수 없습니다.

삼각형에 대한 자세한 내용은 레거시 코드의 암호화"?!?!"를 참조하십시오.


탈출이 불가능한 이유?잘 작동합니다경고조차 없습니다.

왜냐면?(및 이중 따옴표)")는 다음과 같은 표준으로 나타낼 수 있습니다.

C11 § 6.4.4.4 문자 상수 섹션 4

이중 인용문"및 물음표?그들 자신이나 탈출 시퀀스로 표현할 수 있습니다.\"그리고.\?각각, 하지만 단음절은.'그리고 백슬래시\각각 탈출 시퀀스로 표시되어야 합니다.\'그리고.\\.

C++에서 유사함:

C++11 § 2.13.2 문자 리터럴 섹션 3

특정 비그래픽 문자, 단일 따옴표 따옴표"? 백슬래시 그고백시래슬리.\ 6165 6에 수 . 따옴표" 음표물? 시퀀스로 될 수도 있습니다.\"그리고.\?각각, 하지만 하나의 인용구. 백슬래시 그고백시래슬리.\ 시퀀스 탈 시 표 합 니 어 야 다 되 시 출 퀀 로 스 표시됩니다.\’그리고.\\각각 다음과 같다.백슬래시 뒤에 오는 문자가 지정된 문자가 아닌 경우 동작이 정의되지 않습니다.이스케이프 시퀀스는 단일 문자를 지정합니다.

언급URL : https://stackoverflow.com/questions/19374878/why-is-an-escape-sequence-in-c-c