Лекция: С. Дж. Робертс

В следующем фрагменте значение переменной a непредсказуемо:

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

 

Цепочка присваиваний может приводить к различным результатам.

 

Первый способ: c получает значение d, а затем обе

переменные инкрементируются.

Далее b присваивается значение с и затем b инкрементируется. И,

наконец, результат 2 присваивается переменной а.

 

Второй способ: Сначала выполняется цепочка присваиваний, а затем операции инкремента. В этом случае последнее присваивание имеет вид a=0.

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

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

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

Операции с одинаковым приоритетом выполняются слева направо в порядке следования.


Приоритет Оператор Описание
++ Префиксный инкремент
Префиксный декремент
() Вызов функции или подвыражение
[] Выделение элемента массива
-> Указатель структуры
. Член структуры
! Логическое отрицание
  Поразрядное логическое НЕ (двоичная инверсия)
Унарный минус (изменение знака)
+ Унарный плюс
(type) Преобразование к типу
* Разыменование указателя
& Определение адреса переменной
sizeof Определение размера в байтах
* Умножение
/ Деление
% Остаток от деления
+ Сложение
Вычитание
>> Поразрядный сдвиг вправо
<< Поразрядный сдвиг влево
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
== Равно
!= Не равно
& Поразрядное логическое И
^ Поразрядное исключающее ИЛИ
| Поразрядное логическое ИЛИ
&& Логическое И
|| Логическое ИЛИ
?: Оператор условия
= Присваивание
+= Составное сложение
-= Составное вычитание
*= Составное умножение
/= Составное деление
%= Составное определение остатка от деления
>>= Составной поразрядный сдвиг вправо
<<= Составной поразрядный сдвиг влево
&= Составное поразрядное логическое И
^= Составное поразрядное исключающее ИЛИ
|= Составное поразрядное логическое ИЛИ
, Операция «запятая»
++ Постфиксный инкремент
Постфиксный декремент

 

С. Дж. Робертс

«Плененная во тьме» (книга 1)

Серия «Темный дуэт»

Автор: С. Дж. Робертс

Оригинальное название: Captive in the Dark

Название на русском: Плененная во тьме

Серия: Темный дуэт

Перевод: Залина Чеченова

Главные редакторы:

Елена Мартышева

Анна Науменко

Оформление:

Евгения Бермас

 

Переведено специально для группы vk.com/shayla_black

Любое копирование без ссылки на группу ЗАПРЕЩЕНО!

Пожалуйста, уважайте чужой труд!

еще рефераты
Еще работы по истории