永发信息网

if((a<b)||((++a==5)&&(c>b--))),为什么当a<b为真之后,后面就不运算了??

答案:4  悬赏:30  手机版
解决时间 2021-11-17 18:22
  • 提问者网友:且恨且铭记
  • 2021-11-16 18:44
if((a<b)||((++a==5)&&(c>b--))),为什么当a<b为真之后,后面就不运算了??
最佳答案
  • 五星知识达人网友:雾月
  • 2021-11-16 19:19
你对运算符的优先级和操作数的求值顺序存在误解。假设有表达式a+b*c,*号的优先级高于+号的意思是,b*c会先被执行,然后才是a+执行,也就是这个表达式相当于a+(b*c)。但这代表b和c先被求值,a后被求值吗?不是的,C语言标准根本没有规定三个操作数a、b、c的求值顺序,意味着可以是先对a求值,再对b求值,最后对c求值,也可以反过来,甚至可以按照随意的顺序来。你可能认为三个数的求值顺序无关紧要,但如果abc是三个函数呢?例如f()+g()*h(),而这三个函数中又对同一个变量x都做了修改,你还认为他们的求值顺序无关紧要吗?显然这种情况下就成了未定义行为,你是无法预知x的最终值的。
但情况在a||b这样存在短路运算的表达式中又是不同的。如果a和b的求值顺序未知的话,那就无法实现在a的值为1的情况下不再对b求值的短路运算的特性了。因此C语言标准在此处做了规定:||和&&属于顺序点,a||b和a&&b中,一定是a先被求值、b后被求值。
因此可以知道,在a||b&&c这个表达式中,由于&&的优先级高于||,整个表达式相当于a||(b&&c),又由于c语言规定||的左边先被求值,因此先对a求值。当a的值为1时,就不会再计算||右边的部分了。
全部回答
  • 1楼网友:骨子里都是戏
  • 2021-11-16 22:58
作用域问题。
if((ab--)))
(a
(++a==5)&&(c>b--)
是同级作用域。||条件运算符或。只要有一个条件是true结果就是true不需要再往下判断了
  • 2楼网友:独钓一江月
  • 2021-11-16 21:29
这是因为后面的运算是逻辑或||,它只要求有一个为真,整个表达式的值就为真。所以后面的就省略计算了。
  • 3楼网友:过活
  • 2021-11-16 20:25
正是因为&&优先级比||高,所以表达式
(ab--
等效于
(ab--)
整体是一个||关系,先判断(a
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯