c语言运算符优先级,分析……

webtop1 2009-01-06 01:40:59
int x=2,y=2,z=0,a;
if(a=++x||++y&&z++)
{
printf("%d,%d,%d\n",x,y,z);
}
请写出执行结果,和分析运算规则……

...全文
1113 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
上三行 2009-11-17
  • 打赏
  • 举报
回复
[color=#00FFFF]//
//如此说来 (exp1 ¦ ¦ exp2 && exp3)和(exp2 && exp3 ¦ ¦exp1)会有不同的结果,这也不符合生活习惯呀。这难道是“++副作用”
//===================================
//你举的两个运算的含义分别如下:
//1)
//(exp1 ¦¦ exp2 && exp3)
//==>
//(exp1 ¦¦ (exp2 && exp3))
//==>
//exp1 ? 1 : (exp2 && exp3)
//
//2)
//(exp2 && exp3 ¦ ¦exp1)
//==>
//((exp2 && exp3) ¦ ¦exp1)
//==>
//(exp2 && exp3) ? 1 : exp1
//
//由此可以看出,这是不同的运算过程,当然很有可能产生不同结果
//
//至于你说到的矛盾,并不存在,原因如下:
//&& 的优先权高于 || ,指的是数学中的结合律
//比如: 2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = 6 + 20 = 26
//但是因为计算机中的计算是一步步来的,所以计算过程可能是
//2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = 6 + (4 * 5) = 6 + 20 = 26
//(方式1: 先计算运算符左边的表达式,这个比较符合我们的习惯)
//但也有可能是
//2 * 3 + 4 * 5 = (2 * 3) + (4 * 5) = (2 * 3) + 20 = 6 + 20 = 26
//(方式2: 先计算运算符右边的表达式)
//
//但是我们的C语言中,具体采取的是哪种方式呢?
//如果我没记错的话,很多运算的计算次序都没有规定死,是由编译器(比如VC++, tc是不同的编译器)的实现者自己选择的
//即先算左边,还是先算右边,并不确定
//
//然后让我们回到 _逻辑短路原则_ 这个话题
//_逻辑短路原则_ 恰恰就是对 逻辑运算过程 计算次序的一个规定,规定:先计算运算符左边的表达式
//那么,假设有一个运算
//T && T || F && T
//由运算优先级!,有
//(T && T) || (F && T)
//这时面临一个选择,先计算 || 左边还是右边?
//参考 _逻辑短路原则_,先计算左边 (T && T) => T
//从而有
//T || (F && T)
//再次参考 _逻辑短路原则_
//因为运算符是 || ,"或"运算,此时由左边的 T 即可确定整个运算式的值,
//那么编译器判断计算可以结束,右边的(F && T)从而被掠过
[/color]

这是csdn中的一位朋友的帖
  • 打赏
  • 举报
回复
运算符的优先级不是计算优先级,而是结合优先级
fibbery 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 webtop1 的回复:]
既然|| 优先级低,就是不明白为什么不是先计算:++y&&z++中的 z++
[/Quote]

问得好,由于||最低,所以表达式被分成2半,又由于||运算符的运算顺序是从左到右,所以先计算左边,所以,不会先算表达式:++y&&z++的值,
即,先算a=++x,++运算符优先级高于=,所以先加1,然后赋值给a。
nullah 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 webtop1 的回复:]
引用 1 楼 fibbery 的回复:
E:\MyDocs\debug>test
3,2,0

||逻辑运算符的优先级最低

在短路规则的作用下,++x被计算,并赋值给a,由于表达式a=++x不等于0,故为true;
||后面的表达式不予计算

所以,结果为3 2 0


既然|| 优先级低,就是不明白为什么不是先计算:++y&&z++中的 z++
[/Quote]
大牛都说了短路原则
左&&右 左边为0了 就不需要判断了
yellowhwb 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fibbery 的回复:]
E:\MyDocs\debug>test
3,2,0

||逻辑运算符的优先级最低

在短路规则的作用下,++x被计算,并赋值给a,由于表达式a=++x不等于0,故为true;
||后面的表达式不予计算

所以,结果为3 2 0
[/Quote]
这个说的对!
webtop1 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fibbery 的回复:]
E:\MyDocs\debug>test
3,2,0

||逻辑运算符的优先级最低

在短路规则的作用下,++x被计算,并赋值给a,由于表达式a=++x不等于0,故为true;
||后面的表达式不予计算

所以,结果为3 2 0
[/Quote]

既然|| 优先级低,就是不明白为什么不是先计算:++y&&z++中的 z++
waizqfor 2009-01-06
  • 打赏
  • 举报
回复

来个优先级的表格 能明显许多
jiangheng2008 2009-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fibbery 的回复:]
E:\MyDocs\debug>test
3,2,0

||逻辑运算符的优先级最低

在短路规则的作用下,++x被计算,并赋值给a,由于表达式a=++x不等于0,故为true;
||后面的表达式不予计算

所以,结果为3 2 0
[/Quote]
up
shenmou 2009-01-06
  • 打赏
  • 举报
回复
3 3 1 吧

这种东西一般是为考试才出现的。

c 语言本身也有语法不确定的时候,我们的程序应该尽量避免写出这样的语法。
fibbery 2009-01-06
  • 打赏
  • 举报
回复
E:\MyDocs\debug>test
3,2,0

||逻辑运算符的优先级最低

在短路规则的作用下,++x被计算,并赋值给a,由于表达式a=++x不等于0,故为true;
||后面的表达式不予计算

所以,结果为3 2 0

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧