Скромный оператор присваивания на самом
Скромный оператор присваивания на самом деле является очень сложным и решает три разные задачи:
1. Вычисление значения выражения в правой части оператора.
2. Вычисление выражения в левой части оператора; выражение должно определять адрес ячейки памяти.
3. Копирование значения, вычисленного на шаге 1, в ячейки памяти, начиная с адреса, полученного на шаге 2.
Таким образом, оператор присваивания
a(i + 1) = b + c;
несмотря на внешнее сходство с уравнением, определяет сложное вычисление.
2.5. Контроль соответствия типов
В трехшаговом описании присваивания в результате вычисления выражения получается значение конкретного типа, в то время как вычисление левой части дает только начальный адрес блока памяти. Нет никакой гарантии, что адрес соответствует переменной того же самого типа, что и выражение; фактически, нет даже гарантии, что размеры копируемого значения и переменной совпадают.
Контроль соответствия типов — это проверка того, что тип выражения совместим с типом адресуемой переменной при присваивании. Сюда входит и присваивание фактического параметра формальному при вызове процедуры.
Возможны следующие подходы к контролю соответствия типов:
• Не делать ничего; именно программист отвечает за то, чтобы присваивание имело смысл.
• Неявно преобразовать значение выражения к типу, который требуется в левой части.
• Строгий контроль соответствия типов: отказ от выполнения присваивания, если типы различаются.
Существует очевидный компромисс между гибкостью и надежностью: чем строже контроль соответствия типов, тем надежнее будет программа, но потребуется больше усилий при программировании для определения подходящего набора типов. Кроме того, должна быть обеспечена возможность при необходимости обойти такой контроль. Наоборот, при слабом контроле соответствия типов проще писать программу, но зато труднее находить ошибки и гарантировать надежность программы.