Почему а = 6 в море операций не назначает 6 в?(C программирование) - PullRequest
0 голосов
/ 22 апреля 2019

В настоящее время я изучаю основы языка программирования C, но я не могу понять, как C понимает следующий код операторов. Ниже приведена программа, которая печатает «1, 1, 3, 0», в то время как я думаю, что она должна напечатать «1, 1, 6, 0».

Я попытался изменить строку о y с помощью гипотезы, что язык C читает с самого начала, и как только он увидел! Два, то есть один, и || Оператор, он сказал себе: «А, все, что будет после || не имеет значения», и не присвоил 6 единицам.

#include <stdio.h>

int main(void){

    int one = 3, two = 1, x, y;

    x = !!one && ((two = 0) != 0) || 3;
    y = !two || ((one = 6) != 0) && !3;

    printf("%d, %d, %d, %d", x, y, one, two);

} 

Итак, я попытался удалить! в! два, переключая порядок вокруг ||, что подтвердило мою гипотезу. Однако, когда я переключился ((one = 6)! = 0) и! 3, один печатается как 6. Теперь у меня нет ярких идей относительно того, как это происходит.

1 Ответ

3 голосов
/ 22 апреля 2019

Здесь

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...