社区
新手乐园
帖子详情
运算符&&和||优先级问题
koknine
2008-08-06 07:41:24
#include "stdio.h"
main()
{
int x,y,z;
x=y=z=1;
if(x++||y++&&z++)
printf("\n%d,%d,%d\n",x,y,z);
}
这个程序在运行的结果是2,1,1。
可是按照书上说的&&的优先级高于||,
那样应该先 算y和z啊,如果为真应该发生短路,不算x,这样结果应该是1,2,2。
请问这是什么 原因,我理解的错误是什么地方啊
...全文
1617
28
打赏
收藏
运算符&&和||优先级问题
#include "stdio.h" main() { int x,y,z; x=y=z=1; if(x++||y++&&z++) printf("\n%d,%d,%d\n",x,y,z); } 这个程序在运行的结果是2,1,1。 可是按照书上说的&&的优先级高于||, 那样应该先 算y和z啊,如果为真应该发生短路,不算x,这样结果应该是1,2,2。 请问这是什么 原因,我理解的错误是什么地方啊
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
28 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
han020523
2011-03-09
打赏
举报
回复
[Quote=引用 23 楼 hjessica 的回复:]
引用楼主 koknine 的帖子:
#include "stdio.h"
main()
{
int x,y,z;
x=y=z=1;
if(x++ ¦ ¦y++&&z++)
printf("\n%d,%d,%d\n",x,y,z);
}
这个程序在运行的结果是2,1,1。
可是按照书上说的&&的优先级高于 ¦ ¦,
那样应该先 算y和z啊,如果为……
[/Quote]
顶
pl853555
2010-07-30
打赏
举报
回复
以后再写这样的程序不加括号的一律重写
越过越咸
2010-01-20
打赏
举报
回复
isNaN(dd.value)
peter_666
2009-09-14
打赏
举报
回复
[Quote=引用 9 楼 fansyong 的回复:]
我来解释,||逻辑或 左右两边只要有一边为真的话,就成立.
先来看下左边X++X为1自加后为2.是真,于是,右边就不用判断了.也就是说不在执行Y++,Z++
所以,Y=1.Z=1;
[/Quote]
说的很好
koknine
2008-08-07
打赏
举报
回复
[Quote=引用 9 楼 fansyong 的回复:]
我来解释, ¦ ¦逻辑或 左右两边只要有一边为真的话,就成立.
先来看下左边X++X为1自加后为2.是真,于是,右边就不用判断了.也就是说不在执行Y++,Z++
所以,Y=1.Z=1;
[/Quote]
原来是这样
hjessica
2008-08-07
打赏
举报
回复
[Quote=引用楼主 koknine 的帖子:]
#include "stdio.h"
main()
{
int x,y,z;
x=y=z=1;
if(x++ ¦ ¦y++&&z++)
printf("\n%d,%d,%d\n",x,y,z);
}
这个程序在运行的结果是2,1,1。
可是按照书上说的&&的优先级高于 ¦ ¦,
那样应该先 算y和z啊,如果为真应该发生短路,不算x,这样结果应该是1,2,2。
请问这是什么 原因,我理解的错误是什么地方啊
[/Quote]
应该是编译器优化了,即你的x++为true是||后面的值就不运算了。
koknine
2008-08-07
打赏
举报
回复
[Quote=引用 8 楼 moonwrong 的回复:]
引用 7 楼 Inhibitory 的回复:
楼主, 这种问题最好的解决办法是多用括号, 因为这种问题如果去死记硬背并不是一个好方法, 当有不确定的时候, 就用括号.
而且即使你现在背下来了, 但是过一段时间也会很容易忘记, 优先级, 记住个大概就行了, 括号, 才是王道.
up,
x++¦¦y++&&z++
这样真的很麻烦,貌似在戏耍看代码的
[/Quote]
我也是初学,做习题上机时候发现的
koknine
2008-08-07
打赏
举报
回复
我也看书上的习题,才发现的,,搞了半天不明白。
e_sharp
2008-08-07
打赏
举报
回复
编译器可能优化了
可以用括号解决这样的问题
LUCI-Z
2008-08-07
打赏
举报
回复
[Quote=引用 15 楼 Maxwell 的回复:]
优先级体现在算到右边的时候把y++当作右侧还是把y++ && z++当作右侧,先计算左侧这一点是不受优先级影响的。
[/Quote]
kczhuang2008
2008-08-07
打赏
举报
回复
x++ ¦ ¦y++&&z++ 等价于x++ ¦ ¦(y++&&z++)
先计算 x++,x=2为真,(y++&&z++)就不在计算,所以y和z还是为1
xianyuxiaoqiang
2008-08-07
打赏
举报
回复
这时编译器优化的问题。
++运算容易产生二义性。慎用!
太乙
2008-08-07
打赏
举报
回复
[Quote=引用楼主 koknine 的帖子:]
#include "stdio.h"
main()
{
int x,y,z;
x=y=z=1;
if(x++ ¦ ¦y++&&z++)
printf("\n%d,%d,%d\n",x,y,z);
}
这个程序在运行的结果是2,1,1。
可是按照书上说的&&的优先级高于 ¦ ¦,
那样应该先 算y和z啊,如果为真应该发生短路,不算x,这样结果应该是1,2,2。
请问这是什么 原因,我理解的错误是什么地方啊
[/Quote]
对嘛!
if里面,从左到右,先看||前面的,是1,那么后面的就不会计算了!也就是不理会后面的y++ z++
所以输出是那么样子!
Maxwell
2008-08-07
打赏
举报
回复
优先级体现在算到右边的时候把y++当作右侧还是把y++ && z++当作右侧,先计算左侧这一点是不受优先级影响的。
qqwx_1986
2008-08-07
打赏
举报
回复
()这样不为难自己也不为难别人
你好大家都好
babyvox1999
2008-08-07
打赏
举报
回复
写代码尽量不要搞优先级问题,多+括号看起来也舒服
K行天下
2008-08-06
打赏
举报
回复
很明显,因为 || 运算符只要左边的表达式为true,后面的表达式就不会计算了!
所以执行X++之后,y++&&z++不会执行,x变为2, y z仍然为1
NCF_BJ
2008-08-06
打赏
举报
回复
x++ ¦ ¦ y++&&z++
编译器是这样处理表达式:用stack来存放运算符,当遇见优先级低于栈顶的运算符则出栈进行计算,两个加号进栈了,遇见了¦ ¦,则会将+ +弹出栈进行计算,并且若是为1可以直接转到下一个语句,若为0仍得判断表达式后半部分。这个就是编译原理的知识,编译器总希望更高效率进行编译的!!!!!!
fansyong
2008-08-06
打赏
举报
回复
我来解释,||逻辑或 左右两边只要有一边为真的话,就成立.
先来看下左边X++X为1自加后为2.是真,于是,右边就不用判断了.也就是说不在执行Y++,Z++
所以,Y=1.Z=1;
moonwrong
2008-08-06
打赏
举报
回复
[Quote=引用 7 楼 Inhibitory 的回复:]
楼主, 这种问题最好的解决办法是多用括号, 因为这种问题如果去死记硬背并不是一个好方法, 当有不确定的时候, 就用括号.
而且即使你现在背下来了, 但是过一段时间也会很容易忘记, 优先级, 记住个大概就行了, 括号, 才是王道.
[/Quote]
up,
x++¦¦y++&&z++
这样真的很麻烦,貌似在戏耍看代码的
加载更多回复(7)
C语言
运算符
优先级
及表格&ASCII码表&转义字符&
运算符
操作及示例代码
一、
运算符
优先级
百度百科链接: https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80%E8%BF%90%E7%AE%97%E7%AC%A6/1539281?fr=aladdin
优先级
等级口诀 圆方括号、箭头一句号, 自增自减非反负、针强地址长度, 乘除,加减,再移位, 小等大等、等等不等, 八位与,七位异,六位或,五与,四或,三疑,二赋...
逻辑
运算符
、位
运算符
、移位
运算符
、三目
运算符
、
运算符
的
优先级
一、逻辑
运算符
:逻辑
运算符
的作用是用于连接布尔表达式的。 1、& (与,并且) 规律: 只有左右变量同时为true,那么结果才是true,否则就false。2、| (或,或者) 规律: 只要两边的布尔表达式有一边为true,那么结果就为true,只有两边同时为false 的时候,结果才是false。3、^ (异或) 规律: 只要两边的布尔表达式结果不一致,那么结果就为true,如果左右两
三、格式化输入输出,
运算符
优先级
和循环语句
变量a 是字符占一个字节变量b 是字符串,占两个字节,a 和\0,当printf函数在字符串中找到\0后就认为字符串已经结尾了,不会再去查看后面的字符,故变量c 会打印出来Hello变量d 打印出来Hello world之后没有\0结尾后面会打印乱码注:这个\0的0不是数字0而是ASCII编码中的第一位,表示null的空字符。
运算符
,
优先级
,结合性,交换数据的三种方式
算数
运算符
1.对数据进行算数运算的符号 2.分类: 常见的
运算符
:+、-、*、/、% 常见的
运算符
用法 + 数学加法;正数;拼接 - 数学减法;负数 * 数学乘法 / 数学除法 % 取余 *注意:字符串与任意数据类型做+(拼接)时,会先把其他类型转变为字符串,再拼接为更长的字符串 ...
正则表达式 -
运算符
优先级
括号类:用于分组和捕获匹配的内容。圆括号():分组和捕获。方括号[]:字符集,匹配括号内的任意一个字符。花括号{}:量词,指定匹配次数。量词类:用于指定匹配的次数。?:零次或一次。:零次或多次。:一次或多次。{n}:恰好n次。{n,}:至少n次。{n,m}:至少n次,至多m次。定位符类:用于指定匹配的位置。:匹配行的开头。:匹配行的结尾。\b:匹配单词边界。\B:匹配非单词边界。字符匹配类:用于匹配特定类型的字符。:匹配除换行符以外的任意字符。\d:匹配任意数字,等价于。
新手乐园
33,315
社区成员
41,769
社区内容
发帖
与我相关
我的任务
新手乐园
C/C++ 新手乐园
复制链接
扫一扫
分享
社区描述
C/C++ 新手乐园
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章