Определение печати C

Я просматриваю материал на 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).