Widziałem linię C, która wyglądała tak:
!ErrorHasOccured() ??!??! HandleError();
Kompiluje się poprawnie i wydaje się działać poprawnie. Wygląda na to, że sprawdza, czy wystąpił błąd, a jeśli tak, to go obsługuje. Ale nie jestem do końca pewien, co to właściwie robi i jak to robi. Wygląda na to, że programista próbuje wyrazić swoje uczucia na temat błędów.
Nigdy wcześniej nie widziałem ??!??!
w żadnym języku programowania i nigdzie nie mogę znaleźć dokumentacji na ten temat. (Google nie pomaga w wyszukiwaniu takich haseł jak ??!??!
). Co to robi i jak działa próbka kodu?
!ErrorHasOccurred() ??!???! HandleError();
się skompilować? To??!
???
!
. Udowadnia sens?ErrorHasOccured() && HandleError()
siebie. Tak też robi Lua.Odpowiedzi:
??!
to trigraf, który tłumaczy|
. Więc mówi:co z powodu zwarcia odpowiada:
Guru tygodnia (zajmuje się C ++, ale dotyczy tutaj), gdzie to podniosłem.
Możliwe pochodzenie trigrafów lub, jak wskazuje @DwB w komentarzach, jest bardziej prawdopodobne, ponieważ EBCDIC jest trudny (ponownie). Ta dyskusja na forum programistów IBM wydaje się potwierdzać tę teorię.
Z ISO / IEC 9899: 1999 § 5.2.1.1, przypis 12 (h / t @ Random832):
źródło
if (ErrorHasOccured()) HandleError()
. Na szczęście ten idiom zwykle występuje tylko w kodzie Perla.ErrorHasOccurred() && HandleError();
, jeśli jesteś przyzwyczajony do wykonywania skryptów powłoki. :)Cóż, dlaczego to w ogóle istnieje, prawdopodobnie jest inne niż dlaczego w twoim przykładzie.
Wszystko zaczęło się pół wieku temu od zmiany przeznaczenia terminali komunikacyjnych w formie papierowych interfejsów użytkownika. W początkowej erze Uniksa i C był to Teletype ASR-33.
To urządzenie było powolne (10 cps), głośne i brzydkie, a jego widok zestawu znaków ASCII zakończył się na 0x5f, więc nie miał (spójrz na obrazek) żadnego z klawiszy:
Trygrafy zostały zdefiniowane, aby rozwiązać konkretny problem. Pomysł polegał na tym, że programy C mogą korzystać z podzbioru ASCII znalezionego na ASR-33, aw innych środowiskach, w których brakuje wysokich wartości ASCII.
Jednak ludzie piszący kod C niemal z definicji miała nowoczesny sprzęt, 1 więc moje przypuszczenie jest: ktoś popisywać lub bawi samym sobą, pozostawiając rodzaju Pisanka w kodzie, aby znaleźć.
Z pewnością zadziałało, doprowadziło to do bardzo popularnego pytania SO.
ASR-33 Teletype
1. W tym przypadku trygrafy zostały wymyślone przez komitet ANSI, który spotkał się po tym, jak C stał się niekwestionowanym sukcesem, więc żaden z oryginalnych kodów C ani koderów nie użyłby ich.
źródło
#
zostało zastąpione£
. W innych regionach być może „ASCII” nie miałif (x || y) { a[i] = '\0'; }
wyglądania jakif (x öö y) ä aÄiÅ = 'Ö0'; å
w złym zestawie znaków.To jest C- kaligraf .
??!
jest|
, podobnie??!??!
jak operator||
źródło
<iso646.h>
plik nagłówka.Jak już wspomniano,
??!??!
są to zasadniczo dwa trygrafy (??!
i??!
ponownie) wymieszane razem, które są zastępowane-tłumaczone||
, tj. Logiczne OR , przez preprocesora.Poniższa tabela zawierająca wszystkie trygrafy powinna pomóc w jednoznacznym odróżnieniu alternatywnych kombinacji trygrafów:
Źródło: C: A Reference Manual wydanie 5
Tak więc trójwymiarowy wygląd, który wygląda tak
??(??)
, ostatecznie zostanie zamapowany[]
,??(??)??(??)
zostanie zastąpiony przez[][]
i tak dalej, masz pomysł.Ponieważ podczas wstępnego przetwarzania trigry są zastępowane, możesz użyć tego,
cpp
aby samemu zobaczyć wynik, używając głupiegotrigr.c
programu:i przetwarzając go za pomocą:
Otrzymasz wyjście konsoli
Jak można zauważyć,
-trigraphs
należy określić opcję, w przeciwnym raziecpp
pojawi się ostrzeżenie; wskazuje to na to, że trygrafy należą do przeszłości i nie mają żadnej nowoczesnej wartości poza mylącymi ludźmi, którzy mogą się na nie natknąć .Jeśli chodzi o uzasadnienie wprowadzenia kaligrafii, lepiej to zrozumieć, patrząc na sekcję historii ISO / IEC 646 :
(moje podkreślenie)
Zasadniczo niektóre potrzebne postacie (te, dla których istnieje trigraf) zostały zastąpione w niektórych wariantach krajowych. Prowadzi to do alternatywnej reprezentacji za pomocą trójwymiarowych znaków składających się z postaci, które inne warianty nadal miały w pobliżu.
źródło