с++ обладает большими возможностями, чтобы "оторвать себе ноги", то есть много вариантов как можно случайно навредить самому себе, за счёт прямой работы с памятью (указатели, утечка памяти, выход за пределы) и т.д.
Чёт куда-то пишешь, откуда-то вытаскиваешь, одна ошибка - и ты ошибся
Си (язык программирования) позволяет легко выстрелить себе в ногу; с C++ это сделать сложнее, но, когда вы это делаете, вы отстреливаете себе ногу целиком. (С) Страуп.
Ну а если прям на практике:
int I=0
char n[100]
while (I++<10000)
n[I]=I
Компилятор даже не пикнет, а краш обеспечен
хах) ситуация еще лучше - краш не обеспечен. Как повезет. Причем, не знаю, как в этом примере, но бывают ситуации, что компилятор такой - "о, ебать, тут хуйня. я палю четкое ub. А значит я могу молча все исправить, так как программист обязан гарантировать что такого не будет." и пиздец, код уже совсем другую хуйню делает.
Или еще лучше - нарвался на подсказку от студии - "эй чувак, тут лучше ссылку использовать! хули ты, как мудень, копируешь, когда Боги ссылки добавили?". И рекомендует использовать ссылку на элемент вектора, который чуть дальше распидорасивается. Ура, спасибо, теперь у меня вместо копирования UB. (я пробовал добиться этого ворнинга от онлайн компиляторов, но нет. Похоже, чисто студийный помощник какой-то)
Но это мелочи.
Каличь начинается, когда ты начинаешь работать с API и тебе лень / ты рукожоп, а язык программирования дает тебе делать все, что хочешь. Воот тут примеры
https://www.transl-gunsmoker.ru/2008/12/blog-post_6049.html?...
Согласен. Просто на скорую руку накидал пример.
А работа с винапи вообще боль вызывает с одной стороны, а с другой приятные воспоминания из молодости, когда только начинал изучать с/срр и вот эти всё попытки обойтись без библиотек раздувающих конечный размер эзэхи... Эх молодость..
А потом появились большие винты, оперативка стала стоить копеек и вот уже смотришь на 400метровый бинарник из под Qt, который выводит окошко с кнопкой "Say" и по итогу всплывающим окном "hello world!" И кнопкой Ок.... Даже грустно как-то:)
Я логически понимаю, что тут хуйня, а что будет происходить на практике - в мозгу даже шестерёнки не проворачиваются представить)
Просто пойдет запись не пойми чего в не пойми какую память. И из-за этого что-то случится. А может, не случится. Как повезет.
Да хоть инкремент отличный от 1ы :)
Хоть какое выражение пихай, лишь бы оно было равно в итоге или не равно 0.
Вот кстати скомпиленный и запущенный мой пример. Как видишь всё работает, но рухнуло раньше, чем дошло до 10000. При чем при повторном запуске рухнуло уже на другой цифре.
Это и есть та самая возможность выстрела в ногу.
Но я уже 10 лет не открывал VS, поэтому вообще не уверен)
блин, почему то даже не задумывался, что так можно, проверил в шарпе тоже можно, но вопрос нафига?
Я слабый шарпист. Скорее всего у них отличается шаблон для WriteLine из # и printf из с/срр.
Почитай тут как вывести отдельный символ: https://learn.microsoft.com/ru-ru/dotnet/api/system.console....
Ну такое.. Ускорение набора кода разве что. Ну, сэкономил ты секунду, молодец. А потом читать и понимать, что же тут хотели сказать. На скорость работы-то это не повлияет, компилятор один хрен вынесет это в отдельную инструкцию.
Да не. Си просто появился намного раньше, чем оптимизирующие компиляторы, к тому же, он был для компьютеров с другой архитектурой. Тогда всё вот это реально ускоряло работу программы, и все ассемблерные изъёбства той машины с любовью перенесли в Си.
Ну а си-подобные это всё унаследовали, потому что ПрИкОлЬнО.
Ну и "пять старушек - рупь". Если вайлов дохрена, то сэкономить и полчаса можно )
На самом деле влияет на читаемость кода положительно.
Однострочный цикл в зависимости от оформления может занимать от одной, до четырёх строк!
И сиди потом листай вот такие портянки:
while(a)
{
do(b);
}
while(c)
{
do(d);
}
Ну есть же разница:
while(a)
do(b);
while(c)
do(d);
Ни тебе лишних пустых строк, ни скобок этих вечных.






