Правила построения выражений
Выражения состоят из операндов, знаков операций и скобок.
Примеры выражений:
(а + 0.12)/6
х && у || !z
(t * sin(x)-1.05e4)/((2 * k + 2) * (2 * k + 3))
Операции выполняются в соответствии с приоритетами.Для изменения порядка выполнения операций используются круглые скобки.
Если в одном выражении записано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо.Например, a = b = с означает а = (b = с), а a + b + с означает (а + b) + с.
Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем y+1.
Результат вычисления выражения характеризуется значением и типом. Например, если а и b — переменные целого тина и описаны:
int а = 2, b = 5;
то выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае 5) и тип, совпадающий с типом этой переменной.
Таким образом, в C++ допустимы выражения вида а = b = с; сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.
В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями выполняются преобразования типов по определенным правилам, обеспечивающим преобразование более коротких типов в более длинные для сохранения значимости и точности. После этого операнды преобразуются к типу наиболее длинного из них, и он используется как тип результата.
Тема 1.6
Преобразование типов: неявное преобразование и преобразование «в стиле С»
Преобразование типов может быть явным (предусмотренным программистом) и неявным, или стандартным (выполняемым компилятором автоматически).
Необходимо различать преобразования изменяющие внутреннее (битовое) представление данных и изменяющие только интерпретацию внутреннего представления. Например, преобразование знакового типа в беззнаковый меняет лишь интерпретацию, а не внутреннее представление. При преобразовании значений из вещественного типа в целый необходимо изменить длину участка памяти и кодировку, т.е. внутреннее представление.
В ходе некоторых преобразований может происходить потеря информации: потеря точности или изменение численного значения. Это происходит в случае преобразования объекта (переменной, константы) к типу, имеющему меньший диапазон значений. Например, преобразование целого числа в вещественное происходит без потери точности, а преобразование вещественного числа в целое может привести к потере дробной части числа.
На рисунок 1.3 стрелками показаны преобразования, гарантирующие сохранение точности и неизменность численного значения.
Рисунок 1.3 – Преобразования типов, гарантирующие сохранение значимости