在c语言运算时,有和或还看不看优先级?

img

img


不明白的知识点:当&&和||遇到其他符号,什么时候不看其他的,比如0&...不用看后边,哪怕后边有优先级更高的,直接得出结果0;什么时候看优先级?
例如:第一张图的答案是y=20,为什么x=10相当于1,就不用看后边了?括号优先级不是比和或高吗,为什么不执行?
第二张图圈3的答案是1,是按照优先级先算出b+c和b-c,然后依次算得到的答案,还是直接看1|...就不用看后边,直接得出答案1?
第二张图圈4的运算方式又是怎样?

c语言中 0就是假,非0就是真, 10或1的效果一样
&& 和 || 都有短路特性,
0 && 表达式A,这种铁定是假,表达式A不执行
1 || 表达式 B,这种铁定真,表达式B不执行

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/170151
  • 除此之外, 这篇博客: B端产品-定义、分类、竞品分析、与C端产品的区别中的 3.决策产品使用的对象不同 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •  

  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    逻辑运算符&&和||都是逻辑运算符,并不具有比较运算符的运算优先级。它们的运算顺序是由操作符之间的依赖关系所决定的。

    注意:在C语言中,逻辑运算符&&和||具有短路运算的特点,即若第一个运算数已经能够确定表达式的值时,程序就不再计算第二个运算数的值,而是直接返回表达式的值。这种短路运算的方法可以避免不必要的计算,提高计算效率。

    参考资料:

    1. C语言运算符运算优先级(逻辑运算符&&和||没有比较运算符更高或更低的优先级)

    2. C语言逻辑运算符的短路规则

你说的这个叫做逻辑表达式的短路
简单来说,a || b,那么a和b有一个真,表达式就肯定为真了。而 a && b,有一个为假,表达式就为假了。
所以c语言会”偷懒“,遇到 x || (y = 50) > z,x为真,所以 y = 50 不执行了。
可偏偏 y = 50 是一个副作用表达式(所谓副作用表达式,是指,这个表达式求值过程中,会改变变量的值)
所以这种”偷懒“会造成结果的不同。
说这个的目的在于,让你在实际开发中,尽量不要在布尔表达式中引入带有副作用的表达式,比如以上代码,可以写
y = 50;
if (x || y > z) ...
这样,无论编译器是否偷懒,结果都不变

这题跟优先级没有关系
重点在于逻辑与和逻辑或都有短路特性
另,这也就是考试内卷卷出来的题目,谁实际这样编代码会被打死