Pull to refresh

С++ для Perl программистов

Reading time1 min
Views5.4K
Есть старая шутка, что программист на фортране будет писать на фортране на любом языке программирования.

Вот программа на 3 строки, которая компилируется любым C++11 компилятором, после этого нормально запускается и работает.
int main(){
    return !<:]()<%;[=:>(){<:&](){;%>();%>();};
}


Пример в Online IDE
В принципе эту строку можно использовать как детектор на C++ программистов — не все сразу могут понять как это работает.


Пост был написан как социальный эксперимент. С моей точки зрения профессионал должен досконально разбираться в своем инструменте. Если вы догадались что происходит в коде — пишите в комментариях.

Чтобы не терять интригу объяснение под спойлером:
Спойлер
int main(){
    return ![](){;  
       [=](){
          [&](){;}();
       }();
    };
}

Просто некоторые символы заменены диграфами.
Диграфы это часть языка и стандарта ISO C 99 Диграфы. Для С++ есль еще Триграфы. Правда в большинстве компиляторов C++ триграфы отключены по умолчанию. Но сишные диграфы включены.

Появились все эти *-графы потому, что семибитная кодовая страница ISO/IEC 646 (1972 г.) отводила некоторые символы [, ], {, }, ^, ~ под национальные, поэтому нужно было обеспечить совместимость исходного кода с новым стандартом. Так <: — это эквивалент открывающей квадратной скобки.

Время прошло, наступил 21 век, все стали использовать UTF-8, но в стандарте диграфы остались. И что самое отвратительное, во многих легаси проектах до сих пор встречаются. Так что не пугайтесь, увидев такое в старых исходниках

Tags:
Hubs:
Total votes 53: ↑17 and ↓36-19
Comments29

Articles