Опять следуем таблице приоритетов операций.
x *= 3 + 2 |
Опять следуем таблице приоритетов операций. |
x *= (3+2) |
Как мы уже видели раньше, операция присваивания имеет меньший приоритет чам арифметические операции (*= является операцией присваивания). |
(x*=(3+2)) (x*=5) |
Вычисляем выражение |
(x=x*5) (x=10) 10 |
Раскроем операцию присваивания |
Об операторе define. Наша программа начинается со строки #define PRINTX printf("%d\n",x)
Каждая строка в программе на языке С, начинающаяся символом #, есть оператор препроцессора языка С. Одна из функций препроцессора заключается в замене одной строки на другую. Данный оператор define говорит препроцессору, что нужно заменять все встречающиеся в программе строки PRINTX строками printf("%d\n",x).
вначале x=10 x *= y = z = 4 |
|
x *= y = (z=4) |
В этом выражении все операции есть операции присваивания, значит, порядок их выполнения такой, как указан в таблице приоритетов, т.е. справа налево |
x *= (y=(z=4)) (x*=(y=(z=4))) |
|
(x*=(y=4)) (x*=4) 40 |
Вычисляем выражение |
вначале y=4, z=4 x = y == z |
|
x = (y==z) |
Новички, программирующие на языке С, часто путают операции присваивания = и сравнение на равенство ==. Из таблицы приоритетов операций видно, что приоритет операции == выше, чем операции =. |
(x=(y==z)) (x=(TRUE)) |
|
(x=1) | Операции отношения и сравнения на равенство вырабатывают результат ИСТИНА (целое 1) или ЛОЖЬ (целое 0). |
1
вначале x=1, z=4 x == ( y = z ) |
|
(x==(y=z)) |
В этом выражении операция присваивания благодаря действию скобок выполняется раньше, чем операция сравнения на равенство. |
(x==4) |
Вычисляем выражение |
FALSE или 0 |
Значение выражения - 0. Заметьте, однако, что значение x не изменилось (операция == не меняет значения ее операндов, так что PRINTX напечатает 1. |
Содержание раздела