Как сделать логические && и || операторы наряду с увеличением и уменьшением работы? - PullRequest
0 голосов
/ 16 февраля 2020

Оцените следующие выражения. Найти x,y,z значения в каждом случае. Предполагая x=1 и y=5 изначально, что вы наблюдаете:

  1. z=++x && ++y;
  2. z=--x && --y;
  3. z=++x || ++y;
  4. z=--x || --y;

Как логические операторы влияют на значения?

1 Ответ

2 голосов
/ 16 февраля 2020

Я полагаю, что «что вы наблюдаете» очень ясно в том смысле, что вы должны увидеть что-то. Это почти наверняка означает написание кода и анализ того, что происходит.

В любом случае логические операторы воспринимают 0 как ложь, а все остальное - как истину. Выход этих операторов равен 0 для false и 1 для true.

Также имейте в виду, что операторы pre-increment и -decrement изменяют значение перед use.

И, наконец, имейте в виду, что && и || являются операторами короткого замыкания, что означает, что второе подвыражение не всегда может быть оценено. Например:

int x = 1 ; int y = 5 ; int z = --x && --y;

оставит y равным 5, потому что --x - ноль / ложь, поэтому мы знаем, что все выражение будет ложным - нет необходимости оценивать вторую подпоследовательность. выражение.

Этого должно быть достаточно, чтобы выяснить, каковы результаты, исходя из ваших предварительных условий для x и y.


В качестве подсказки, давайте посмотрим на первом. ++x и ++y будут 2 и 6 соответственно, так что оба значения верны. Следовательно, true && true даст значение true, в итоге получится 1.


А теперь, поскольку вы написали некоторый код (согласно вашему комментарию, спрашивающему о том, что вы считаете странным поведение операторов -- и ++ в некоторых случаях), вот мой пример кода, который показывает операции:

#include <stdio.h>

int main() {
    int x, y, z;

    x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
    z=++x && ++y;
    printf(", newx= %d, newy = %d, z = %d\n", x, y, z);

    x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
    z=--x && --y;
    printf(", newx= %d, newy = %d, z = %d\n", x, y, z);

    x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
    z=++x || ++y;
    printf(", newx= %d, newy = %d, z = %d\n", x, y, z);

    x = 1; y = 5; printf("oldx = %d, oldy= %d", x, y);
    z=--x || --y;
    printf(", newx= %d, newy = %d, z = %d\n", x, y, z);

   return 0;
}

Вывод этого:

oldx = 1, oldy= 5, newx= 2, newy = 6, z = 1
oldx = 1, oldy= 5, newx= 0, newy = 5, z = 0
oldx = 1, oldy= 5, newx= 2, newy = 5, z = 1
oldx = 1, oldy= 5, newx= 0, newy = 4, z = 1
...