Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 18 19 20 [ 21 ] 22 23 24 ... 210


следующий объект, а декрементированный указатель - предыдущий.

Операции инкремента (++) или декремента (-- ) могут появляться перед или после своего операнда. Когда операция является префиксом своего операнда, то операнд инкрементируется или декрементируется и его новое значение является результатом вычисления выражения. Когда операция является постфиксом своего операнда, то непосредственным результатом выражения является значение операнда перед его инкрементированием или декрементированием. После этого результат используется в контексте, а операнд инкрементируется или декрементируется.

Простое присваивание

Операция простого присваивания (=) выполняет присваивание. Правый операнд присваивается левому операнду. При присваивании выполняются некоторые правила преобразования.

Составное присваивание

Операция составного присваивания состоит из простой операции присваивания, скомбинированной с другой бинарной операцией. В составном присваивании вначале выполняется операция, специфицированная аддитивным оператором, а затем результат присваивается левому операнду. Выражение составного присваивания, например, имеет вид:

<expression 1> += <expression 2> и может быть понято как:

<expression 1> = <expression 1> + <expression 2>

Однако, выражение составного присваивания не эквивалентно расширенной версии, поскольку в выражении составного присваивания <expression 1> вычисляется только один раз, в то время как в расширенной версии оно вычисляется дважды: в операции сложения и в операции присваивания. Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операций, и соответственно ограничивает типы своих операндов. Результатом операции составного присваивания является значение и тип левого операнда.



Старшинство и порядок выполнения

На старшинство и порядок выполнения операций Си влияют способы группирования и выполнения операндов в выражениях. Старшинство операций имеет смысл только при наличии нескольких операций, имеющих разные приоритеты. Выражения с более приоритетными операциями вычисляются первыми.

Старшинство операций уменьшается сверху вниз. Операции, расположенные в одной строке таблицы или объединенные в группу имеют одинаковое старшинство и одинаковый порядок выполнения.

Только операция последовательного вычисления (,) и логические операции И (&&) и ИЛИ (!!) обеспечивают определенный порядок вычисления операндов. Операция последовательного вычисления (,) обеспечивает преобразование своих операндов слева направо. (Заметим, что запятая, разделяющая аргументы в вызове функции, не является операцией последовательного вычисления и не обеспечивает таких гарантий.)

Логические операции также обеспечивают вычисление своих операндов слева направо. Однако логические операции вычисляют минимальное число операндов, необходимое для определения результата выражения. Таким образом, некоторые операнды выражения могут быть не вычислены. Например, в выражении x && y ++ второй операнд y ++ вычисляется только тогда, когда x есть true (не нуль). Так что y не инкрементируется, когда x есть false (нуль).

Побочные эффекты

Побочные эффекты - это изменения состояния машины, которые возникают в результате вычисления выражений. Они имеют место всякий раз, когда изменяется значение переменной. Любая операция присваивания вызывает побочный эффект, и любой вызов функции, который содержит операцию присваивания, имеет побочные эффекты.

Порядок получения побочных эффектов зависит от реализации, за исключением случаев, когда компилятор



обеспечивает определенный порядок вычислений. Например, побочный эффект имеет место в следующем вызове функции:

add ( i + 1, i = j +2)

Аргументы вызова функции могут быть втчислены в любом порядке. Выражение i + 1 может быть вычислено перед i=j+2 , или наоборот, с различным результатом в каждом случае.

Унарные операции инкремента и декремента включают присваивание и могут быть причиной побочных эффектов, как это показано в следующем примере:

a=b++=c++=d++;

Значение a непредсказуемо. Значение d (инициализируется нулем), могло быть присвоено c, затем b и затем a, прежде чем любая из переменных была бы инкрементирована. В этом случае a должно было бы быть эквивалентно нулю.

Второй способ вычисления этого выражения начинается вычислением операнда c++=d++. Значение d (инициализированное нулем) присваивается c, а затем d и c инкрементируются. Затем значение c, которое теперь равно 1, присваивается b и b инкрементируется.

Наконец, инкрементированное значение b присваивается a. В этом случае окончательное значение a равно 2.

Так как язык Си не определяет порядок изменения состояний машины (побочных эффектов) при вычислениях, то оба эти метода вычисления корректны и могут быть выполнены. Операторы, которые зависят от частностей порядка вычисления побочных эффектов, выдают непереносимый и неясный код.

Преобразования типов

Преобразование типов имеет место, когда тип значения, которое присваивается переменной, отличается от типа переменной. Преобразование типов выполняется, когда операция перед вычислением преобразует тип своего операнда или операндов и когда преобразуется значение, посылаемое как аргумент функции.



1 ... 18 19 20 [ 21 ] 22 23 24 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика