Я просматриваю материал на C. Я не уверен, почему ответ 12 и 32. В первом printf()
я думал, что %d
= 2 ( i
), %d
= 2 ( j
), \n
= новая линия. Может кто-нибудь объяснить это?
#include int main(void) { int i,j; i=2 && (j=2); printf("%d%d\n",i,j); (i=3) || (j=3); printf("%d%d\n",i,j); }
Причина 12 печатается вместо 22, потому что i
присваивается значение 2 && (j=2)
. Сначала j
присваивается значение 2
. Затем (j=2)
возвращает 2
. После этого 2 && 2
оценивается как true
и возвращает true
. Это связано с тем, что && проверяет, истинны ли обе стороны, а 2
интерпретируется как истина. Поскольку обе стороны истинны, она возвращает true, которая равна 1.
||
не оценивает правую сторону, если слева оценивается значение true. Причина в том, что это необязательно. Он должен оценивать значение true, если хотя бы один из операторов оценивает значение true, а i = 3 оценивает значение 3, которое интерпретируется как истинное. Вот почему 32 печатается вместо 33.
Для этого можно использовать функцию, которая не оценивает правый операнд, если значение left равно true.
foo() || printf("foo() returned false\n");
И аналогично для &&, но этот оператор не оценивает правый операнд, если влево оценивается значение false.
foo() && printf("foo() returned true\n");
Обратите внимание, что я не предлагаю использовать эти трюки. Я просто использую их как пример того, как || и && может пропустить оценку правильного операнда в зависимости от значения слева.
Для первого выражения i=2 && (j=2);
неявно оценивается как i = (2 && (j = 2));
потому что оператор присваивания =
имеет более низкий приоритет по сравнению с логическими операторами. В первом условии 2 имеет значение истины true
, а логическое AND &&
заставляет оценивать все условия, а также вычисляется j = 2
, присваивая 2 j
и возвращающий 2, который оценивается как true
. Итак, теперь фактическое выражение, подлежащее оценке, равно i = 2 && 2;
который является true
или в терминах C, 1. Таким образом, i
присваивается 1, а первый результат равен 12
.
Для второго выражения (i=3) || (j=3);
(i=3) || (j=3);
, логическое ИЛИ ||
и короткое замыкание гарантирует, что если первое условие оценивается как true
, общее выражение true
и поэтому второе условие не оценивается. Поэтому после оценки i = 3
i
назначается 3, и все выражение истинно, поэтому j = 3
не оценивается. Итак, второй вывод – 32
.
На основе приоритетов первое выражение оценивается как
i = (2 && (j=2));
Итак, i = 1 (true) и j = 2. Поэтому первый выход – 12.
Второе выражение является логическим ИЛИ двух назначений.
(i=3) || (j=3);
Но так как первая оценка слева – «истина» (i = 3), вторая оценка не выполняется. Поэтому значение j остается равным 2, а второй – 32 (не 33).