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