c语言的“逻辑短路”与 运算符优先级,有点矛盾?

syecho 2007-11-13 10:22:29
c规定:&& 的优先权要高于 ||
c优化:在“exp1 && exp2” 中如果exp1为false,则不再计算exp2的值
c优化:在“exp1 || exp2” 中如果exp1为true,则不再计算exp2的值

那么:
int a=1;
int b=1;
int c=1;
int d;

d=a>0 || ++b>1 && c++>1


按照规定, 要先计算 && ,也就是需要计算出 ++b和c++
按照优化, 只要计算出 a>0 就可以了,不需要计算出 ++b和c++

我看《C 语言解惑》里面讲:应该按照优化计算,
x=1,y=1,z=1;
++x || ++y && ++z 只要计算++x即可以
如此说来 (exp1 || exp2 && exp3)和(exp2 && exp3 ||exp1)会有不同的结果,这也不符合生活习惯呀。这难道是“++副作用”


到底应该如何?






...全文
2217 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
KandyDev 2012-10-16
  • 打赏
  • 举报
回复
C中好像没规定&&的优先级高于||的。我看的书上说的是它俩个的优先级是相等的。
优先级从高到低是:
!>算术运算符>关系运算符>&&和||>赋值运算符
兆帅 2012-04-18
  • 打赏
  • 举报
回复
d=a>0 || ++b>1 && c++>1 不就等于 d=(a>0 || (++b>1 && c++>1))么 有什么歧义,不明白楼主的意思!?
NET小工 2007-11-15
  • 打赏
  • 举报
回复
3楼说法是不对滴,在C++里,短路早已经被纳入新标准,以加强移植性。
NET小工 2007-11-15
  • 打赏
  • 举报
回复 2
这个问题是偶的强项了,绝对没有冲突,只是绝大部分人对法典理解不够深刻。
运算符优先级不是运算优先级,而是结合性优先级,意指:高优先级的运算符所结合的变量或表达式,不能被低优先级的运算符分离。
前缀的++与后缀的++具有同样的优先级,只是执行结果不一样。他们的结合性优先级都高于&&,但是他们的运算优先级要低于||,表达式在取值时,按照递推结合,递归返回的顺序运算,所以编译器会先处理优先级低的运算符。
举个简单的例子:a+b*c,编译器会先处理+号,得知最终返回的是和值,然后再分析加号的左右两个操作数,或者操作表达式。
8知道有没有说明白,这个问题,额。。。。。。懂了就懂了,不懂就拉倒,应用开发的时候,完全可以忽略,毕竟,谁敢写楼主这样的表达式,是必定要被老大狠K的。
hello0world 2007-11-14
  • 打赏
  • 举报
回复
你的想法有问题
你所说的例子是用与判断的
而且书上说的也只判断时才能参考优化
所以只关心判断结果
如果要是想要得到结果,也就是若要进行运算的话
那就必须按照优先级进行
syecho 2007-11-14
  • 打赏
  • 举报
回复
我的意思是讲:

c规定:&& 的优先权要高于 ¦ ¦



c优化:在“exp1 && exp2” 中如果exp1为false,则不再计算exp2的值
c优化:在“exp1 ¦ ¦ exp2” 中如果exp1为true,则不再计算exp2的值


都是C里面的规定,我的理解方法有问题,产生矛盾,不知道应该如何理解?如何找到一个不矛盾的说法。

e.g.
x=y=z=1;
x>=1 || ++y>1 && z>=1 ;

如果按照
c规定:&& 的优先权要高于 ¦ ¦
应该先计算 ++y项,得到y=2

如果按照
c优化:在“exp1 && exp2” 中如果exp1为false,则不再计算exp2的值
c优化:在“exp1 ¦ ¦ exp2” 中如果exp1为true,则不再计算exp2的值

应该不计算 ++y项,得到y=1
ForestDB 2007-11-14
  • 打赏
  • 举报
回复
简言之,即使优化也得遵循优先级的规则先。
halve 2007-11-14
  • 打赏
  • 举报
回复

//
//如此说来 (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)从而被掠过
iunion 2007-11-13
  • 打赏
  • 举报
回复
++、--的优先级高于逻辑运算

(exp1¦¦exp2&&exp3)和(exp2&&exp3¦¦exp1)的结果有可能会不同要看具体情况

x=1,y=1

x-- || x>0 && y>0
不同于
x>0 && y>0 || x--

不过一般谁会这样写呢,给自己找麻烦
这样写SR都过不去的,怎么交工
yuyu1234 2007-11-13
  • 打赏
  • 举报
回复
观望~~中
hello0world 2007-11-13
  • 打赏
  • 举报
回复
(exp1¦¦exp2&&exp3)和(exp2&&exp3¦¦exp1)
怎么会有不同结果呢
按照优化的话
第一个只要exp1为1就不用算后面的了
第二个还是只要exp1为1就不用算前面的了
一样的啊

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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