c++ komentarze i inne pułapki


Pułapki c++

Po opublikowaniu tego wpisu kolega podesłał mi informację o podobnych pułapkach w c++. Zobaczcie sami… pułapki, pułapki, wszędzie pułapki c++.

Mamy diabelnie skomplikowany kod. Kto postawiłby pieniądze na jego wynik? Czy w tym kodzie jest coś podejrzanego?

Niby oczywistość… prawda…   nawet IDE (cLion) ostrzega, że pierwsze przypisanie n=10 jest niepotrzebne.

clion

No to sprawdźmy. Na ekranie konsoli zobaczymy…

Zaskoczeni? To powiedzcie, co zobaczymy na ekranie po uruchomieniu tego kodu c++? O ile oczywiście poprawnie się to skompiluje, bo IDE pokazuje, że ten kod jest bez sensu.

clion2

Program skompiluje się poprawnie (MAGIA) i na ekranie zobaczymy:

Wyjaśnienie zagadki

W cpp mamy pewnie zbiór di-grafów oraz tri-grafów. Zostały one wprowadzone w prehistorycznych czasach, aby umożliwić kodowanie na klawiaturach niewyposażonych w niektóre znaki. Kompilator przetłumaczy te wyrażenia na przypisane im wartości, zanim przystąpi do właściwej analizy kodu. Ponadto w wersji 14 wprowadzono pewne dodatkowe tokeny.  Poniżej zestawienie dostępnych pułapek. Co bardzo ważne, poniższe znaki są konwertowane, nawet jeśli będą zapisane jako łańcuchy tekstowe. Komitet standaryzacyjny c++ przegłosował usuniecie trigraphs ze standardu w c++17.

TrigraphWartość
??=#
??/\
??’^
??([
??)]
??!|
??<{
??>}
??-~
DigraphWartość
<:[
:>]
<%{
%>}
%:#
TokenWartość
%:%:##
compl~
not!
bitand&
bitor|
and&&
or||
xor^
and_eq&=
or_eq|=
xor_eq^=
not_eq!=


W pierwszym przykładzie tri-graph ??/ został zamieniony na znak “\“, który to obecny na końcu komentarza powoduje jego kontynuację do następnej linii.

 

 

Źródło: Wikipedia

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany.