Операции 3.1
вначале x=2, y=1, z=0 x = x && y z | |
x = (x&&y) z x = ((x&&y)z) (x=((x&&y)z)) | Сопоставляем операции с операндами в соответствии с приоритетами операций |
(x=((TRUE&&TRUE)z)) | Логические операции выполняются слева направо. Считается, что значение операнда в логической операции есть ЛОЖЬ, если операнд равен 0, и ИСТИНА, если операнд имеет любое другое значение |
(x=(TRUEz)) | Логическая операция И (&&) вырабатывает значение ИСТИНА, если оба ее операнда имеют значение ИСТИНА, иначе она вырабатывает значение ЛОЖЬ. |
(x=(TRUEчто-то еще) | |
(x=TRUE) (x=1) 1 | Если известно, что один из операндов логической операции ИЛИ () имеет значение ИСТИНА, то результат операции - ИСТИНА, независимо от значения другого операнда. Таким образом, в данном случае нет смысла продолжать вычисления дальше |
Еще об операторе define. Оператор препроцессора, начинающий эту программу более сложный, чем в предшествующей программе. Здесь PRINT - имя макроподстановки с аргументами, а не просто строка, как ранее, которую надо заменить на другую строку. Препроцессор производит макроподстановку с аргументами в два этапа: вначале в теле подстановки формальные аргументы заменяются на фактические, затем получившаяся строка подставляется вместо обращения к макроподстановке.
Например, в этой программе PRINT имеет один формальный аргумент int. PRINT(x) - обращение к PRINT с фактическим аргументом x. Таким образом, каждое вхождение int в теле подстановки заменяется на x, затем получившаяся строка - printf("%d\n",x) подставляется вместо PRINT(x). Отметим, что аргумент int не сопоставляется с комбинацией букв int в середине идентификатора printf, так как формальный аргумент макроподстановки суть идентификатор и он сопоставляется только с идентификатором int.
Операции 3.2
вначале x=1, y=1, z=0 x ! y && z | |
x (!y) && z x ((!y)&&z) (x((!y)&&z)) | Сопоставляем в соответствии с приоритетами операций операции с операндами. |
(TRUE((!y)&&z)) (TRUEчто-то еще) TRUE или 1 | Вычисляем слева направо. |