Pascal vs C

Мир Когнито
Pascal vs C++

Начну с того, что конечно, следует признать, что введение фигурных скобок {} вместо служебных слов begin и end в  Паскале и Делфи – это несомненное преимущество С++.

Но вот введение неординарного оператора i++ - это весьма сомнительное его достижение.
Тогда как, во-первых, всего лишь на чуть труднее написать i=i+1 вместо i++.
Но самое главное – то, что во-вторых. А именно то, что идёт вследствие за этой задумкой создателей С++. Например, как интерпретировать, скажем i+*? (что вполне принимает транслятор С++. Но как он это интерпретирует – вот вопрос.)

Следующее сомнительное достижение С++ - это переменная типа указатель, значением которой является адрес переменной заданного типа.(ибо совершенно непонятно, для каких практических нужд такие переменные необходимы. (лучше бы ввели в языка переменные типа процедура, как это сделано в Pascal, т.к. это намного более актуально.)
И 1-ое предположение такое: чтобы создавать запутанные (обфускованные) алгоритмы.)
И самое простое в объявлении переменной типа указатель, если указывается сама переменная, на которую указывает этот указатель:
int * pa = a;
что и является не только объявлением переменной-указателя, но и и её инициализацией (=присвоением первичного значения)
И, если до этого переменная а была объявлена так
int a[n];
то переменная pa становится указателем на значение типа int[n], то есть 1-мерный массив целых чисел из n элементов. При этом n должно быть по факту целым числом или целой константой.
Ну а если а до этого не объявлена? То что же имеем в pa? По, идее, ничего. Потому что тип переменой, на которую указывает pa – неизвестен.

Но есть и другой способ иницализации переменной типа указатель, с помощью оператора new.
Оператор new возвращает адрес некоторой (неизвестной) переменной, но заданного типа, в переменную типа указатель на заданный тип. Например, так:
int * pb=new int;
В результате чего pb присваивается адрес некоторой целой переменной, пока что неизвестной.
Тогда как оператор & - возвращает адрес заданной переменной, в переменную типа указатель (на переменную данного типа). Например:
int a;
int * pa=&a;
Здесь мы сначала объявили целую переменную a, а потом потом объявили переменную-указатель на целое число, после чего инициализировали последнюю, присвоив ей адрес некоторой целой переменной а, значение которой пока еще неизвестно (но зато извествен адрес её в памяти)

Но указатели можно объявлять, но не инициализировать. Просто вот так:
int * pa;
так мы объявили переменную-указатель на некоторую целую переменную.
Инициализировать же данную переменную мы можем потом следующим оператором:
pa= new int;
После чего в переменную pa записывается адрес некоторой целой переменной. (значения у которой пока еще нет)

Но как объявить указатель на массив целых переменных?
int * pb=new int[m];
И тут всё понятно: переменной pb типа указатель мы присваиваем адрес области памяти, в которой будет храниться массив целых чисел из m элементов .
(а точнее – адрес начала этой области памяти. Адрес конца этой области памяти транслятор, по идее, не вычисляет (хотя всё необходимое у него для этого есть), а поэтому не выдаёт ошибки типа «выход за границы массива». Что (выдача этой ошибки) является нормой для всех остальных языков программирования, но только не для С++. Поэтому такое является весьма серьёзным дефектом данного языка.
Что, в частности, подтверждает сформулированную ранее цель создания данного языка – обеспечить максимальные возможности для обфускации (запутывания) алгоритмов.)

Еще один серьёзный недостаток данного языка выявляется, когда же мы начинаем создавать, вводить и выводить 2х-мерные (а тем более многомерные) динамические массивы.
Ибо тут гемор конкретный возникает, т.к. выясняется, что синтаксис языка С++ не предусматривает простое выполнение этих операций, т.к в нём фактически нет 2х-мерных динамических массивов.
Что, в общем, подтверждает сформулированную ранее цель создания данного языка – обеспечить максимальные возможности для обфускации (запутывания) алгоритмов.)