C 逻辑&&;和| |运算符以及递增和递减工作?
计算以下表达式。在每种情况下查找C 逻辑&&;和| |运算符以及递增和递减工作?,c,logical-operators,pre-increment,C,Logical Operators,Pre Increment,计算以下表达式。在每种情况下查找x、y、z值。假设最初x=1和y=5,您观察到了什么: z=++x&&++y z=--x&&--y z=++x | |++y z=--x | |--y 逻辑运算符是如何影响这些值的?我认为“你观察到了什么”非常明确,因为你应该看到一些东西。这几乎肯定意味着编写代码并检查发生了什么 在任何情况下,逻辑运算符都将0视为false,其他任何操作都视为true。对于false,这些运算符的输出为0,对于true,这些运算符的输出为1 还要记住,预递增和-递减运算符在使用前
x、y、z
值。假设最初x=1
和y=5
,您观察到了什么:
z=++x&&++y代码>
z=--x&&--y代码>
z=++x | |++y代码>
z=--x | |--y代码>
0
视为false,其他任何操作都视为true。对于false,这些运算符的输出为0
,对于true,这些运算符的输出为1
还要记住,预递增和-递减运算符在使用前会更改值
最后,请注意,&&
和| |
是短路运算符,这意味着第二个子表达式可能并不总是被计算。例如:
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;
}
我相信“你观察到了什么”是非常明确的,因为你应该看到一些东西。这几乎肯定意味着编写代码并检查发生了什么
在任何情况下,逻辑运算符都将0
视为false,其他任何操作都视为true。对于false,这些运算符的输出为0
,对于true,这些运算符的输出为1
还要记住,预递增和-递减运算符在使用前会更改值
最后,请注意,&&
和| |
是短路运算符,这意味着第二个子表达式可能并不总是被计算。例如:
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;
}
好的,我在控制台上得到了正确的三种情况,但在执行第二种情况时,输出是d=0、x=0和y=5,那么为什么y不递减(预递减)?@Mayank,
&&
运算符短路。换句话说,如果第一个子表达式为false(它是false,因为当x为1时,--x
为零),则它根本不计算第二个子表达式。没有必要,因为false&&ANYTHING
是false
。项目3也是如此。我已经更新了答案。谢谢你的解释。我明白了。好的,我在控制台上得到了正确的三种情况,但在执行第二种情况时,输出是d=0、x=0和y=5,那么为什么y不递减(预递减)?@Mayank,&&
运算符短路。换句话说,如果第一个子表达式为false(它是false,因为当x为1时,--x
为零),则它根本不计算第二个子表达式。没有必要,因为false&&ANYTHING
是false
。项目3也是如此。我已经更新了答案。谢谢你的解释。我得到了它。