逻辑 && 和 || 如何运算符以及递增和递减工作?

How do logical && and || operators along with increment and decrement work?

计算下列表达式。在每种情况下查找 x,y,z 个值。假设最初 x=1y=5,您观察到什么:

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

逻辑运算符如何影响值?

我认为 "what do you observe" 非常明确,您应该 看到 一些东西。这几乎肯定意味着编写代码并检查会发生什么。

在任何情况下,逻辑运算符都将 0 视为假,其他任何情况都视为真。这些运算符的 output0 为 false,1 为 true。

另外请记住,预递增和递减运算符会在 使用 之前更改值。

最后,请注意 &&|| 是短路运算符,这意味着可能并不总是对第二个子表达式求值。例如:

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

将使 y 等于 5,因为 --x 是 zero/false 所以我们知道整个表达式将为假 - 无需计算第二个子表达式.

根据 xy 的先决条件,这应该足以弄清楚结果是什么。


作为提示,我们来看第一个。 ++x++y 将分别是 26,所以都是真的。因此 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