Здесь
x = !!one && ((two = 0) != 0) || 3;
сначала !!one
вычислено, т. Е. Сначала !one
, что составляет 0
, а затем снова !0
, что 1
, т. Е. true
, затем логический оператор И &&
и * Свойство 1013 * состоит в том, что если первый операнд равен true
, то проверяется только второй операнд , что является правильным в нашем случае.
x = !!one && ((two = 0) != 0) || 3;
| | |
true --------------
(1) |
solve this now
второй операнд &&
равен ((two = 0) != 0)
, который сначала составляет two
как 0
(ноль), а затем 0!=0
, что является ложным. Теперь это выглядит как
x = true && false || 3
| |
--------
|
false || 3 <= logical OR property is if 1st operand is false then need to check second operand.
x = false || true
x = 1
Итак, после этого выражения x=1
и two=0
.
Далее, под выражением
y = !two || ((one = 6) != 0) && !3;
Первый !two
решен первым, т. Е. !0
т.е. 1
, то есть true
, а логический оператор ИЛИ ||
означает, что , если первый операнд равен true, тогда второй операнд не оценивается из-за короткого замыкания. Следовательно это становится
y = 1;
Итак, после этого выражения
x=1
two=0
и y=1
оставляют все без изменений, т. Е. one
будет его начальным значением, равным 3
. Так что это
printf("%d, %d, %d, %d", x, y, one, two);
отпечатков 1, 1, 3, 0
Примечание , таблица истинности логическое ИЛИ ||
оператор
A B A||B
------------
0 0 0
0 1 1 => If 1st operand is zero, need to evaluate 2nd operand because 2nd operand may be 0 or 1
1 0 1 => if first operand is 1(true), result is always going to true, hence don't evaluate second operand
1 1 1
Таблица истинности логического оператора И &&
равна
A B A&&B
------------
0 0 0
0 1 0 => If 1st operand is zero, result is always going to false, so need not to evaluate 2nd operand.
1 0 0 => if first operand is 1(true), Need to evaluate 2nd operand because 2nd operand may be 0 or 1.
1 1 1