![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
В следующем фрагменте значение переменной a непредсказуемо:
d=0; a=b++=c++=d++;
Цепочка присваиваний может приводить к различным результатам.
Первый способ: c получает значение d, а затем обе переменные инкрементируются.
Далее b присваивается значение с и затем b инкрементируется. И, наконец, результат 2 присваивается переменной а.
Второй способ: Сначала выполняется цепочка присваиваний, а затем операции инкремента. В этом случае последнее присваивание имеет вид a=0.
Оба метода с точки зрения стандарта языка являются правильными. Стандарт сознательно устроен так, что большинство подобных вопросов оставлено на усмотрение разработчиков компиляторов, так как лучший порядоквычислений определяется архитектурой машины.
Вывод: Для обеспечения переносимости программ следует избегать выражений, которые зависят от порядка вычислений и дают непредсказуемые побочные эффекты (побочные эффекты иногда полезны).
В следующей таблице приведены приоритеты и порядок выполнения для всех операций Си (включая и те, которые еще не изучались).
Операции с одинаковым приоритетом выполняются слева направо в порядке следования.
Приоритет | Оператор | Описание |
++ | Инкремент | |
-- | Декремент | |
() | Вызов функции или подвыражение | |
[] | Выделение элемента массива | |
-> | Указатель структуры | |
. | Член структуры | |
! | Логическое отрицание | |
Поразрядное логическое НЕ (двоичная инверсия) | ||
- | Унарный минус (изменение знака) | |
+ | Унарный плюс | |
(type) | Преобразование к типу | |
* | Разыменование указателя | |
& | Определение адреса переменной | |
sizeof | Определение размера в байтах | |
* | Умножение | |
/ | Деление | |
% | Остаток от деления | |
+ | Сложение | |
- | Вычитание | |
>> | Поразрядный сдвиг вправо | |
<< | Поразрядный сдвиг влево | |
< | Меньше | |
> | Больше | |
<= | Меньше или равно | |
>= | Больше или равно | |
== | Равно | |
!= | Не равно | |
& | Поразрядное логическое И | |
^ | Поразрядное исключающее ИЛИ | |
| | Поразрядное логическое ИЛИ | |
&& | Логическое И | |
|| | Логическое ИЛИ | |
?: | Оператор условия | |
= | Присваивание | |
+= | Составное сложение | |
-= | Составное вычитание | |
*= | Составное умножение | |
/= | Составное деление | |
%= | Составное определение остатка от деления | |
>>= | Составной поразрядный сдвиг вправо | |
<<= | Составной поразрядный сдвиг влево | |
&= | Составное поразрядное логическое И | |
^= | Составное поразрядное исключающее ИЛИ | |
|= | Составное поразрядное логическое ИЛИ | |
, | Операция "запятая" |
Дата публикования: 2014-12-25; Прочитано: 188 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!