Лекция: С. Дж. Робертс
В следующем фрагменте значение переменной 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
Любое копирование без ссылки на группу ЗАПРЕЩЕНО!
Пожалуйста, уважайте чужой труд!