sami
Местный
Давай-те ка еще раз вернемся к этому оригинальному куску кода. На каком вы говорите языке его написали? На C? Повторяюсь в C нет перегрузки операторов и потоков вывода.Хорош затягивать интригу. Вот оно:
Некоторые недоразвитые компиляторы первым оператором эквивалентят переменную и константу, в результате чего после второго оператора константа "2" принимает значение "3".Код:int val=2; *val=3; cout << 2*2;
Сей нелепостью грешат все компиляторы С (не С++!) от Мелкософта.
Если не брать во внимание вывод значения в консоль, то стэйтмент *val = 3; - тоже не валидное для типа int.
Сначала я подумал что мало-ли, я ведь не знакок C, может быть вдруг C при разыменовании переменной целого типа приводит ее к указателю (не мог же фокусник написать невалидный код!). Оказалось что нет, C такое не делает и разыменовывать переменные целого типа не желает.
Код:
prog.c:5:2: error: invalid type argument of unary ‘*’ (have ‘int’)
*val=3;
^
Но если бы C пожелал это сделать, то смысл стейтмента *val = 3; я бы прочитал как "положить значение 3 по адресу 2", или расписать чужую память, что есть UB. Но я приврал, UB не будет, т.к. этот код не компилится.
В описании языка (в спецификации) нет понятия "ссылка".Константа здесь ни при чем. И никому она тут не нужна.
Во втором операторе - меняется значение переменной по ссылке. - Это так должно быть по описанию языка.
Получается что *val = 3; выполнено не будет, ибо до выполнения дело не дойдет благодаря ошибке компиляции.Вот и получается, что
*val=3; будет выполнено как *pval=3; - с2 стало равно "3".
Ну, и далее в том же духе:
оператор вывода (последний) превратится в cout << (*pc2)*(*pc2) и напечатает "9".
И никаких UB. Просто не надо эквивалентитить служебную ссылку на переменную со служебной ссылкой на константу.
И оператор вывода (что за оператор такой?) ни во что не превратится, ибо ни оператора вывода, ни потока вывода в C не существует.