etc./StackOverFlow

"???!???!" 연산자는 C에서 어떤 용도인가요?

청렴결백한 만능 재주꾼 2021. 12. 1. 00:00
반응형

질문자 :Peter Olson

다음과 같은 C 라인을 보았습니다.

!ErrorHasOccured() ??!??! HandleError();

올바르게 컴파일되었고 정상적으로 실행되는 것 같습니다. 오류가 발생했는지 확인하고 오류가 발생하면 처리하는 것 같습니다. 하지만 실제로 무엇을 하고 있는지 또는 어떻게 하고 있는지 잘 모르겠습니다. 프로그래머가 오류에 대한 자신의 감정을 표현하려는 것처럼 보입니다.

난 본 적이 없어 ??!??! 이전에는 어떤 프로그래밍 언어로도 사용할 수 없었고 어디에서도 이에 대한 문서를 찾을 수 없습니다. ??!??! 와 같은 검색어를 지원하지 않습니다.) 코드 샘플은 무엇을 하며 어떻게 작동합니까?

??! A는 trigraph 라 로 변환 | . 그래서 다음과 같이 말합니다.

!ErrorHasOccured() || HandleError();

단락으로 인해 다음과 같습니다.

if (ErrorHasOccured()) HandleError();

Guru of the Week (C++을 다루지만 여기서는 관련됨), 여기서 내가 이것을 선택했습니다.

trigraphs의 가능한 출처 또는 @DwB가 주석에서 지적했듯이 EBCDIC가 (다시) 어렵기 때문일 가능성이 더 큽니다. IBM developerworks 게시판에 대한 이 토론은 그 이론을 뒷받침하는 것 같습니다.

ISO/IEC 9899:1999 §5.2.1.1, 각주 12(h/t @Random832 ):

삼중 그래프 시퀀스를 사용하면 7비트 US ASCII 코드 세트의 하위 집합인 ISO/IEC 646에 설명된 대로 고정 코드 세트에 정의되지 않은 문자를 입력할 수 있습니다.

user786653

글쎄, 이것이 일반적으로 존재하는 이유는 아마도 귀하의 예에 존재하는 이유와 다를 것입니다.

이 모든 것은 하드카피 통신 터미널을 컴퓨터 사용자 인터페이스로 용도 변경하면서 반세기 전에 시작되었습니다. 초기 Unix 및 C 시대에는 ASR-33 Teletype이었습니다.

이 장치는 느리고(10cps) 시끄럽고 추악했으며 ASCII 문자 집합의 보기가 0x5f에서 끝났으므로 키가 없었습니다(그림을 자세히 보십시오).

{ | } ~

trigraphs 는 특정 문제를 해결하기 위해 정의되었습니다. 아이디어는 C 프로그램이 ASR-33과 높은 ASCII 값이 누락된 다른 환경에서 발견된 ASCII 하위 집합을 사용할 수 있다는 것이었습니다.

귀하의 예는 실제로 두 가지입니다 ??! , 각 의미 | , 결과는 || .

내 생각 엔 그래서 그러나, 거의 정의에 의해 C 코드를 작성하는 사람들은 일을 현대적인 장비를 가지고 : 누군가가 당신이 찾고있는 코드에서 부활절 달걀의 종류를 떠나, 과시하거나 스스로가를 즐겁게.

그것은 확실히 효과가 있었고 매우 인기있는 SO 질문으로 이어졌습니다.

ASR-33 텔레타이프

ASR-33 텔레타이프


1. 그 문제에 대해, C가 대성공을 거둔 후에 처음으로 만난 ANSI 위원회에서 삼중 그래프를 발명했으므로 원래 C 코드나 코더 중 누구도 이를 사용하지 않았을 것입니다.

DigitalRoss

C trigraph 입니다. ??! 이다 | , 그래서 ??!??! 연산자는 ||

Joel Falcou

이미 언급했듯이 ??!??! 본질적으로 두 개의 삼중 그래프 ( ??!??! || 로 대체 번역됩니다. , 즉, 전처리기에 의한 논리적 OR.

모든 삼중 그래프가 포함된 다음 표는 대체 삼중 그래프 조합을 명확하게 하는 데 도움이 됩니다.

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

출처: C: 참조 설명서 5판

??(??) 처럼 보이는 삼중 그래프는 결국 [] ??(??)??(??) [][] 로 대체되는 식으로 아이디어를 얻습니다.

trigraph는 전처리 중에 대체되기 때문에 trigr.c 프로그램을 cpp 를 사용하여 출력을 직접 볼 수 있습니다.

void main(){ const char *s = "??!??!"; }

다음과 같이 처리합니다.

cpp -trigraphs trigr.c

다음과 같은 콘솔 출력을 얻을 수 있습니다.

void main(){ const char *s = "||"; }

알 수 있듯이 -trigraphs 옵션을 지정해야 합니다. 그렇지 않으면 cpp 가 경고를 표시합니다. 이것은 삼자 문자가 어떻게 과거의 것이고 부딪칠 수 있는 사람들을 혼란스럽게 하는 것 외에는 현대적 가치가 없음을 나타냅니다.


trigraphs 도입의 근거는 ISO/IEC 646의 역사 섹션을 보면 더 잘 이해됩니다.

ISO/IEC 646과 그 전신인 ASCII(ANSI X3.4)는 통신 산업의 문자 인코딩에 관한 기존 관행을 크게 지지했습니다.

ASCII는 영어 이외의 언어에 필요한 많은 문자를 제공하지 않았기 때문에 덜 사용되는 일부 문자를 필요한 문자로 대체하는 여러 국가 변형이 만들어졌습니다 .

(강조 내)

따라서 본질적으로 일부 필요한 문자(삼각자가 존재하는 문자)는 특정 국가 변형에서 대체되었습니다. 이것은 다른 변형이 여전히 가지고 있는 문자로 구성된 삼중 그래프를 사용하는 대체 표현으로 이어집니다.

Dimitris Fasarakis Hilliard

출처 : http:www.stackoverflow.com/questions/7825055/what-does-the-operator-do-in-c

반응형