c语言 ++x||++y&&++z

++x||++y&&++z x=0,y=0,z=0 x=1,y=0,z=0,表达式=1 既然++优先级大于逻辑运算符,那又为什么在++x后不计算++y,++z而是直接不判断后面的值?

c语言中或运算符如果运算符前面的一项不为0则后面一项不执行,否则执行,与运算符如果前面一项为0则后面一项不执行,否则后面一项执行,也就是说当前面的一项的值能够决定这个表达式的值的时候后面的都不再执行,当前面的一项不能决定该表达式的值时,才需要继续执行后一项的值,你所写的程序执行过程如下:由于++x=1为真,则或运算的表达式为真,则其后的++y不执行,所以到此x=1,y=0;继续执行后面的与运算,由于前面的++x||++y表达式为真,不能够决定整个与运算表达式是否为1,则继续执行++z,所以有z=1,所以该表达式的值为1。。。。。。追问

那么优先级又有什么意义,不是没什么用吗?

追答

有用,只是这就涉及到运算符的另一个特点了,结合性,是左结合还是又结合,当编译时,系统检测到有||和&&运算符就会先结合左边的,右边的相当于会被先屏蔽掉。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-04-05
看来你对优先级的理解有点问题。优先并不决定运算顺序,它的实质是结合性,是说++是与y结合在一起而不是和||结合在一起;前面的++也是与x结合在一起。而||是连接(++x)和(++y)运算符而不是连接x和++的运算符。C/C++中表达式的运算顺序一律从左至右!本回答被提问者采纳
第2个回答  2020-03-02
|| 和 && 都有逻辑短路功能
简言之

A || B 如果A是真的,B就不会再被计算了。
A && B 如果A是假的B就不会再被计算了
评论有人提到优先级问题,&&的优先级略高于||
因此对于 A||B&&C事实上等价于 A||(B&&C),因此会先计算A的值,如果A为真会跳过(B&&C)的求值过程。
++x||++y&&++z
可以看到 ++x 的结果是1,也就是真,所以 || 右边的不会被计算了。
因为逻辑运算的副作用。
逻辑或:仅当第一个操作数的计算结果为 false (0) 时计算第二个操作数。 在逻辑“或”表达式为 true 时,这将消除对第二个操作数的不必要的计算。
逻辑与:仅当第一个操作数的计算结果为 true (1) 时计算第二个操作数。 在逻辑“与”表达式为 false 时,这将消除对第二个操作数的不必要的计算。
第3个回答  2018-02-28
因为“左结合律”和“ 短路求值 ”。
C语言保证逻辑运算的求值顺序是从左往右的。
用括号显示优先级是这样的:
(++x) || (++y && ++z)

个人觉得,在不影响语意的前提下,把运算过程看成这样∶
(1 && ++x) || (++y && ++z)

c中对于逻辑或的运算是只要第一个表达式为真,就不会去算后面的表达式了
第4个回答  推荐于2018-03-03
这样分解:++x||++y&&++z , 这个表达式中++x 与 ++y&&++z 两者构成“或”表达式。或表达式中两者有一个为真,表达式即为真。在C中,对于或表达式,当第一个表达式为真是,就可以认为真个表达式为真,没必要去计算后面的表达式的值。
如果你真的想要知道到底是为什么?计算机为什么要这样做。建议你看看编译原理中的表达式的翻译方案,你就会懂的。本回答被网友采纳

c语言 ++x||++y&&++z
则或运算的表达式为真,则其后的++y不执行,所以到此x=1,y=0;继续执行后面的与运算,由于前面的++x||++y表达式为真,不能够决定整个与运算表达式是否为1,则继续执行++z,所以有z=1,所以该表达式的值为1。。。

c语言++x||++y&&++z输出的xyz是什么
a&&b,如果a为false, 则b表达式不执行,a||b,如果a为true,则b表达式不执行 假如开始时:x = 1, y = 1, z = 1,则结果为:x= 1 y = 2, z = 2

C语言中,++x||++y&&++z的意思是?还有++x&&++y&&++z???
1,++x||++y&&++z 先给x + 1,若等于0,计算右边,分别给y和z +1后若不为0整个表达式不为0,若x +1不等于0则不计算右边的表达式;2,++x&&++y&&++z 先给x +1, 若不等于0,计算右边,给y +1若不等于0,计算右边,给z +1若不等于0表达式不等于0;否则整个表达式为0;3...

c语言表达式t=++x||++y&&++z;怎么理解,小弟初学,看不懂,求老师指点...
1。算++y&&++z就是计算y&&z只要y与z都不为0,那么结果为1,否则为0;2。随后算++x||(++y&&++z),令d=++y&&++(这句是为了容易理解才写的),随后判断x||d,只要x与d至少一个不为0,那么结果就是1,否则结果为0;3。然后把结果给t;4。最后x y z三个数的值各加1 ...

当x=y=z=0时,c语言中++x || ++y && ++z; x ,y,z的值是多少
于是右侧的++y&&++z不会被执行。 y和z还是原始值0.四、 综上, 执行后x=1, y=0, z=0.五、 编写如下程序验证:include <stdio.h>int main(){ int x, y, z;x=y=z=0;++x||++y&&++z;\/\/原始表达式printf("%d %d %d\\n", x,y,z);\/\/输出三个值。 return 0;}最终输出1 ...

请问关于C中++x||++Y&&++z的问题
这个东西是表达式运算顺序的问题,当"++X"为真以后,"||"后面的表达式其实是没有被运行的.所以结果应该是X=1 Y=0 Z=0

x=y=z=1 t=++x||++y&&++z 求t,x,y,z的值
我给你说下c++和c语言处理这行代码的过程。首先是从左往右的。t=++x||++y&&++z 第一步:t= (++x) || (++y&&++z);因为||这个符号的优先级最低。第二步:++x; 执行完之后x=2;(对于||这个符号有个特点就是如果左边是非零,那么直接就返回值了,不用执行右边了。因为没有意...

这道c语言题怎么错了?
t的值应该是1。选项C是正确的。解析:x=y=z=1;t=++x||++y&&++z;后面一句相当于:t=(++x||++y&&++z);这是一个赋值语句,赋值号右边是一个逻辑运算表达式。因为整个逻辑表达式的值为真,所以,其值为1。所以t的值也就是1。

请问c语言t=++x||++y&&++z这句话是什么意思?
c ++x||++y&&++z ++x = 2 , ++y = 2 , ++z = 1 (++x||++y)&&++z,可以这样来分,前面因为++x=2 所以扩号的值是1 1&&++z = 1&&1=1 这些都是逻辑判断,不要去理会具体等于多少,只要看它等于0还是等于1就可以了 ...

C语言中逻辑运算的“短路”特点的疑问。
你的陈述正确;你的疑问是没搞清||和&&的优先级,&&要比||高一级,所以++x||++y&&++z;的实质是++x||(++y&&++z);,所以||后面的整个表达式都不计算了。你的疑问与第1一样,但表述有错。++x是前++,要先计算,所以++x的值是1;但&&两边都为“真”才能确定这“真”,有一边或两边都为...

相似回答