– Мне стало известно, что вчера в нашей клинике произошёл вопиющий случай, – сказал тот.
Но наиболее вопиющим случаем стала работа отделения экстренной медицинской помощи.
Анализ собственного капитала фирм, оставляющий место для предвзятости, необходимо корректировать, а в особо вопиющих случаях – даже игнорировать его результаты.
Брак на время сократился, но вопиющие случаи по-прежнему происходили.
Но самое главное возражение против обоснования принципа принудительной силы контрактов исключительно через идею неэтичности нарушения обещаний состоит в том, что современная деловая мораль далеко не всегда считает нарушение договорных обязательств чем-то априори аморальным, сохраняя такую характеристику в основном за отдельными особенно вопиющими случаями контрактного оппортунизма.
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать
Карту слов. Я отлично
умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я стал чуточку лучше понимать мир эмоций.
Вопрос: кривить — это что-то нейтральное, положительное или отрицательное?
Мы так жить не хотим – и обычно не живём (за исключением совсем уж вопиющих случаев, которые, замечу, вызывают всеобщее осуждение).
Более того, однажды произошёл и совершенно вопиющий случай: раздражённый упрёками жены в измене, он в запальчивости ударил её кулаком по лицу.
Полиция в этой стране по-прежнему убивает граждан, но подобные вопиющие случаи больше не освещаются в новостях.
Идущие по следу группы комиссии, которые проверяли провинции, правительственные министерства, госпредприятия, также отмечали вопиющие случаи коррупции.
– Вы знаете о количестве бытовых ссор, ведущих к насилию, о вопиющих случаях супружеского смертоубийства?
Конечно, в вопиющих случаях карали, ежели злодеи начинали путать свой карман с монаршим.
Теперь где-то в пути была специальная комиссия, назначенная для расследования этого вопиющего случая расточительства в военное время.
Я говорю о заусеницах, об облупившемся лаке. И вообще вопиющий случай, – когда у женщины обгрызенные ногти.
Но даже после явно вопиющих случаев, когда людям делали укол, потому что они мучились от болей в результате перелома, центры продолжали работать и принимать клиентов, а прокуратура на многие вещи смотрела сквозь пальцы.
Был в моей практике вопиющий случай на эту тему.
Во-вторых, даже в этом вопиющем случае тон не меняется.
Нельзя не отметить отдельные вопиющие случаи затягивания строительства, приводящие в итоге к банкротству застройщика.
Она считала, что если кто-то что-то где-то нарушит или даже «напакостит», а то и уроки прогуляет, то можно будет обойтись «почти смертным приговором», ну в крайнем, каком-нибудь вопиющем случае – «высшей мерой пресечения».
Я после этого вопиющего случая попыталась с ним поругаться, так меня настолько тактично оттёрли – до сих пор рука, заломленная бдительными стражами думского тела, болит.
Вскрылись вопиющие случаи насилия над людьми в этом месте.
Это похоже на скверный анекдот, но я знал ещё более вопиющий случай самоубийства.
Они возбуждённо обсуждали имевший только что место «вопиющий случай нарушения свободы и конституционных прав».
Но столь вопиющий случай необходимо обнародовать, а для этого ей понадобится хороший адвокат.
Вчера вечером случился просто вопиющий случай.
– Банальный, но случившийся крайне не вовремя вопиющий случай халатности, – продолжила вещать заезжая полковник.
– И он до сих пор так и не усвоил элементарных правил, обязательных для всех сотрудников полиции, государственных служащих, чему примером служит последний вопиющий случай, – закончил следователь, давая понять, что последнее слово всё равно за ним.
Этот вопиющий случай вызвал бурный резонанс в обществе.
Если вдруг произойдёт какой-то вопиющий случай, это будет решать совет.
Они никогда бы не пошли на такую работу, если бы у них не оставалось возможности в каком-то вопиющем случае отказаться её выполнять.
Но и по сей день суды с большой неохотой вмешиваются в конфликты между супругами, за исключением вопиющих случаев с тяжкими последствиями.
Был ещё один вопиющий случай беспамятства, когда тёща забыла зятя на балконе.
Этот вопиющий случай переполнил чашу нашего терпения.
Рассказывали о вопиющем случае нападения на караван, вёзший харим купца, который бедняга успел вовремя отослать из города.
– Нужен какой-нибудь вопиющий случай, чтобы заставить людей бунтовать.
Я неоднократно писал о вопиющих случаях полицейского беспредела, но редактор не давал полного хода моим расследованиям, многозначительно показывая пальцем наверх.
Лучшие офицеры подозреваются в крамоле, да ещё этот сегодняшний вопиющий случай.
Но тут был какой-то вопиющий случай беззащитной порядочности.
Когда она пригрозила разводом, отступил, но вопиющий случай шантажа ей при случае припоминал.
Теперь все обитатели офиса знали, что в туалете «имели место быть вопиющие случаи неуважения к коллегам».
Будут ли власти реагировать на столь вопиющие случаи равнодушия к человеческой жизни?
Землянин был почти уверен, что самые вопиющие случаи спустили на тормозах и скрыли от него, но не настаивал.
Это был вопиющий случай мужского коварства.
Но один вопиющий случай год назад изменил всё, разрушив привычные устои.
Были даже совсем вопиющие случаи рабства и нищеты!
Этот городок надолго запомнит вопиющий случай.
Речь идёт о конкретном вопиющем случае халатности.
Чего только стоит вопиющий случай, когда пассажира, стоявшего на площадке вагона, ограбили и сбросили на полотно.
Но эта иллюзорная идиллия нашей современной «цивилизованности» регулярно нарушается вопиющими случаями дикости и вандализма, которые совершают внешне вроде бы культурные люди даже в богатых и развитых демократических странах.
– Как вы можете прокомментировать вопиющий случай погребения жителя вашего города без гроба?!
Несмотря на это, вчерашний инцидент является вопиющим случаем.
« | There are just two kinds of languages: the ones everybody complains about and the ones nobody uses. | » |
— Бьёрн Страуструп (Bjarne Stroustrup) |
« | На говне сметану не сделаешь | » |
— Народ о Qt для C++ |
Бьёрн Страуструп, создатель С++ собственной персоной.
Типичный программист на C++
С++ (си-плюс-плюс, плюсы́, cpp, кресты, приплюснутый, чсвшн. The Programming Language) — язык программирования, о котором слышали многие, но которым, судя по всему, пока никто полностью не овладел. Создан мужиком типично нердической внешности (очки, свитер, лысина) с забавной фамилией Страуструп с целью поднять зарплаты специалистов в индустрии, что, судя по всему, ему успешно удалось.
Первоначально представлял собой язык Си (в него же и компилировался, чтобы затем использовать многочисленные готовые компиляторы Си под конкретную платформу), к которому прикрутили «классы» (сишные структуры с функциями внутри) и оператор ++ («увеличить на единицу»/«сделать шаг вперёд»), от которого и произошло название. Ныне же, со всеми доработками и библиотеками, представляет свалку метафор и паттернов является универсальным ЯП, поддерживаемым на чуть менее, чем всех платформах. Очень сильно потеснил своего предка, благодаря чему большинство соответствующих инструментов теперь маркируется как «C/C++». Благодаря такой генетике на нём до сих пор можно писать шустрый и не требующий больших ресурсов код, способный без тормозов и мыла влезть в жопу каждую кофеварку.
Язык быстро стал заложником собственной популярности: из-за дрочки на совместимость с тоннами практически сразу же написанного кода его развитие пошло по «системе Ниппель», когда невозможно вычистить что-то из нового стандарта, не доставив анальной боли той или иной группе хомяков. Одновременно с этим, он очень сильно отличается от старичка Си (и других популярных языков) тем, что акцент в развитии сделан не на функционале (которым стандартная библиотека крайне скудна), а на конь-септуальности[1]. Благодаря сочетанию этих двух факторов, в одном C++’ном проекте можно встретить 10 и более разных типов строк[2].
Никому не принадлежит. Если Java pwned by Oracle и сильно прихватизирована силами зла, а C# анально имеем Microsoft’ом, плюсики разрабатываются комитетом. Отсюда, в основном, и проистекают его многочисленные достоинства и недостатки:
- Весьма невысокая выразительность. Ввести новое ключевое слово, даже если оно сто лет назад было зарезервировано и об этом написано на каждом заборе, гарантированно означает сделать чей-то продукт некомпилируемым, а значит представители владельцев этого продукта в комитете будут упираться раком и голосовать против. Поэтому то, что в других языках будет принято с песней и энтузиазмом, в C++ будет не принято вовсе или реализовано самым неочевидным способом[3].
- Отсталость. Причины те же.
- Всё ж таки, комитет не просто штаны протирает, а реально отстаивает усреднённые интересы IT’шного бизнеса, а значит и типичного сферического разработчика в вакууме.
- Можно не бояться, что завтра компания-владелец свернёт лавочку, язык предаст анафеме, начнёт стращать судом опенсорсников и срать разработчикам в души и карманы.
Чудо-оружие эпохи технофашизма, о чём громко говорит имя описывающего его стандарта: ANSI ISO/IEC 14882:1998. Самый новый стандарт называется C++20 (ISO/IEC 14882:2020).
[править] Как же так вышло?
Есть два способа выучить C++ за 21 день: фантастический…
…и реалистичный.
Всё началось в океане с того, что парень по имени Алан Кей изобрёл[4]НЁХ под названием ООП (воплотив свои идеи в языке SmallTalk). История этого изобретения не только доставляет, но и способна навести на кое-какие умные мысли. Как-то раз Алан, ползая раком по коридору с распечатками своих программ, подметил случай вопиющей дискриминации: оказалось, что обычные переменные можно объединить в структуры (что примерно соответствует созданию шаблона карточки), а вот функции — хрен. Это делало простые переменные гражданами первого класса, а функции на их фоне — гражданами каких-то других классов. «Шо за несправедливость!», — подумал Алан, вспоминая, как за несколько дней до этого профессор в Университете Юты Боб Бартон отлил в граните: «Базовый принцип рекурсивного проектирования состоит в том, что сущности на любом уровне вложенности должны обладать равными возможностями». Оказалось, что уравнять функции и переменные в праве находиться внутри структур, это как дать возможность к карточке добавлять кнопки, при нажатии на которые карточка сама может слазить в картотеку, распечататься на принтере и т. п.
Принцип этот дичайше доставляет тем, что будучи применён ещё раз, ИЧСХ — снова к функциям, но только в другом контексте (функции сделали гражданами первого класса, разрешив наряду с данными передавать их как параметры в другие функции, а также хранить их внутри переменных, описывая в виде простых выражений) — он порождает не менее великую НЁХ — ФП. Так что, анон, подумай на досуге, кого ещё можно с кем уравнять в правах — глядишь, изобретёшь что-то не менее великое, чем ООП и ФП и твой фотопортрет спрячут в хрестоматию.
Как бы то ни было, в начале 80-х, примерно через 15 лет после описываемых событий, компания Bell Labs поручила своему сотруднику, Бьярне Страуструпу, написать какую-то информационную систему под собственные нужды (что-то связанное с телефонными вызовами, как и положено компании Белла). Бьярне подошёл к задаче как типичный, сцуко, программист: он решил, что для напейсания ему требуется свой фреймворк своя библиотека свой язык! Во всех имеющихся языках имелся фатальный недостаток. А вот конец этой истории оказался вовсе даже не типичным: вместо того, чтобы проебать все сроки, нихуя не написать и быть уволенным за долбоебизм и мегаломанию, Бьерне ВНЕЗАПНО закончил работу над языком, написал к нему транслятор и даже требуемую изначально информационную систему. Богатырь — не вы!
Изначально Страусик хотел писать всё на Симуле — языке, содержавшем зайчатки ООП ещё в те времена, когда Алан Кей не разродился Смолтоком. Однако оказалось, что результат такого программирования на доступном ему железе тормозит как Крузис на Спектруме. А говнокодить на низкоуровневом языке BCPL в силу ущербности последнего ему показалось дольше, чем написать свой язык с блекджеком. В результате он взял за основу Си, приделал к нему ООП в духе Симулы/Смолтока, и написал cfront — транслятор из нового улучшенного Си («Си с классами») в олдфажный Си. Язык неожиданно для Бьярне стал дичайше популярен среди его коллег, например, а потом — и среди прочих мимокрокодилов.
Первое время свистоперделки к языку он добавлял в одного, но позже передал эти обязанности комитету по стандартизации. Где-то примерно в это же время русский по фамилии СТепанов и китаец по фамилии Ли набыдлячили библиотеку STL, что, якобы, расшифровывается как Standard Template Library (но мы-то знаем!). С одной стороны, это была хорошая, годная библиотека, ибо позволяла при помощи шаблонов работать с такими сущностями, как строки и массивы. С другой — она была полна дичайших изъёбств в названиях (вместо Array — vector, вместо Add() — push_back() и т. п.) и спорных архитектурных решений (считать алгоритмы не частью объектов, как, казалось бы, следует из духа ООП, а независимыми сущностями). К восторгу одних и ужасу других, эта библиотека стала частью стандартной библиотеки языка.
Позже выяснилось, что строковый тип, который нихуя не умеет работать с текстом (заменять фрагменты, например) — это, конечно, круто, стильно, молодёжно, но немного недостаточно для плодотворного программирования. То же самое касалось отсутствующих регекспов, работы со временем и другого функционала, доступного в прочих языках из коробки, но требующего от сиплюсплюсника прибегать к старым добрым, но устаревшим сишным функциям. Тогда другие умники, чьи имена не столь известны, запилили boost — хтонический многогигабайтный ужоснах, построенный на тех же принципах, что и STL, но дающий искомый функционал. О его простоте и дружелюбности красноречиво говорит название модуля для работы со временем: Boost.Chrono. К ещё большей попоболи обладающих вкусом месье части Буста тоже начали стандартизировать. Параллельно с этим язык обзаводился совершенно инопланетным синтаксисом (аж целых несколько операторов приведения типов, один из которых выглядит как std::uintptr_t v1 = reinterpret_cast<std::uintptr_t>(&i); и прочий BDSM).
Наконец, под влиянием более молодых конкурентов — всяких шарпов — к языку прикрутили элементы ФП (лямбды и прочее), отчего язык окончательно начал выглядеть инфернально.
Тем не менее, он и в 2021 году остаётся чуть ли не единственным языком, гарантирующим максимальную переносимость, наличие библиотек на все случаи жизни, отсутствие нежданчика с производительностью и независимость от каких-либо крупных вендоров.
[править] Священная книга
Как и положено каждой уважающей себя секте, программисты на C++ обзавелись собственным священным писанием — Стандартом. Именно так, с большой буквы и никак иначе (см. эту статью, например).
Стандарт состоит из множества нумерованных разделов, подразделов и подраздельчиков (типа, «7.6.2.9»), исчерпывающе описывающих, почему твой говнокод обязательно приведёт к Undefined Behavior — ситуации, когда в зависимости от фазы Луны, разработчика твоего компилятора, версии операционной системы и других факторов произойдёт что угодно, что совершенно невозможно предсказать заранее. Например, твой компьютер превратится в кашалота или горшок с петунией.
Великие гуру способны, глядя в произвольный исходник, по памяти называть номера разделов, которые нарушает каждая строчка такого кода.
[править] И к чему пришло?
Язык цветёт и пахнет. В смысле, вполне себе жив. Если верить TIOBE (это такое кармадрочерство для языков, может, не самое справедливое или объективное, но на другие никто не ссылается), уже долгие, долгие годы в Царя горы играют Java с Pure C, по очереди сталкивая друг друга с первого места на второе. А наш герой стабильно входит в пятёрку самых популярных, выше Шарпа, но ниже Питона, лол.
Язык прочно занял свои ниши — движки игр, например — и вряд ли их сдаст в ближайшее время.
В вебе, как бы ни казалось обратное, он тоже незримо присутствует. Взять хоть браузеры, которые его отображают. Или Мускул/Машу, где данные анонимуса хранит большая часть сайтов. Все они написаны на связке языков, в которой плюсы занимают почётное место.
Ах да, как сообщают с мест, битва за карточку метрополитена проиграна Жабе. Это печально.
[править] Хелловорлды
Самый элементарный
#include <cstdio> int main() { puts( "Hello, World" ); return 0; }
Вариант 0
#include <iostream> int main() { std::cout << "Hello, Worldn"; }
Сферический в вакууме.
Отмечается, что «n» не эквивалентно «std::endl», так что вариант #1 более верен.
Вариант 1
#include <iostream> int main() { std::cout << "Hello, World" << std::endl; }
Вариант 2
#include <stdio.h> int main(void) { const char *message[] = {"Hello ", "World"}; int i; for(i = 0; i < 2; ++i) printf("%s", message[i]); printf("n"); }
На самом деле это сишный код, но сипипи компилером он тоже жуётся.
Вариант 3
#include <iostream.h> #include <string.h> class string { private: int size; char *ptr; public: explicit string(const char* chrs = 0) : size(chrs ? strlen(chrs) : 0) { ptr = new char[size + 1]; if (chrs) strcpy(ptr, chrs); else ptr[size] = 0; } string(const string &s) : size(s.size) { ptr = new char[size + 1]; strcpy(ptr, s.ptr); } ~string() { delete [] ptr; } friend ostream &operator <<(ostream &, const string &); string &operator=(const char *); string &operator=(const string&); }; ostream &operator<<(ostream &stream, const string &s) { return(stream << s.ptr); } string &string::operator=(const string &s) { this->~string (); new (this) string (s); return(*this); } string &string::operator=(const char *chrs) { *this = string(chrs); return(*this); } int main() { string str; str = "Hello World"; cout << str << endl; return(0); }
Как то так.
Вариант 4
#include <cstdio> #define HelloWorld #define BEGIN { #define END } #define PROGRAM int main() #define WRITELN(a) puts(a); PROGRAM HelloWorld BEGIN WRITELN("Hello, World") END
Для олдфагов. На настоящем паскале выглядит, впрочем, несколько иначе.
Вариант 5
#include <iostream> #include <boost/mpl/vector_c.hpp> #include <boost/mpl/for_each.hpp> #include <boost/lambda/lambda.hpp> typedef boost::mpl::vector_c<char,'H','e','l','l','o',',', ' ','W','o','r','l','d'> string; int main() { boost::mpl::for_each<string>(std::cout<<boost::lambda::_1); std::cout<<std::endl; };
Шаблонно-бустовый
Вариант 6
#include <string.h> #include <unistd.h> int main() { char *str="Hello, World!"; write(1, str, strlen(str)); return 0; }
По принципу ассемблера. Тоже сишный код, кстати.
Вариант 7
#include <iostream> #include <list> #include <algorithm> using namespace std; int main() { list<string> hw {"hello", " ", "world"}; for (auto &s: hw) cout << s; cout << endl; for_each(hw.begin(), hw.end(), [](string &s){ cout << s; }); cout << endl; }
C++11 ^__^. Здесь присутствуют такие ништяки как: initializer lists, type inference (т.е. auto), range-based for-loop, lambda и for_each. К сожалению, регэкспы пока в gcc-4.6* не пашут.
Вариант 8
#include <iostream> #include <cstring> using namespace std; int main() { char str[strlen("Hello, World!") + 1]; strcpy(str, "Hello, World!"); cout << str; return 0; }
Исправленный пример от Анонимуса.
Вариант 9
#include <stdio.h> int main() { char * h="Hello, World!n