鱼C论坛

 找回密码
 立即注册
查看: 28|回复: 1

关于C语言学习S1E10课后习题中无法理解的答案寻求详细解释

[复制链接]
回帖奖励 20 鱼币 回复本帖可获得 20 鱼币奖励! 每人限 1 次
发表于 昨天 10:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请用小括号和数字序号体现表达式中运算符的优先顺序,并口算出表达式的值(下边假设变量 a、b、c、d 的值分别是 1、2、3、4)
比如:a + b * c - d
写成:(a + (b * c)1)2 – d
求值:(1 + (2 * 3)) – 4 == 3   


E. a = b - c || a % b && c / d
写成:a = ((b – c)4 || ((a % b)1 && (c / d)2)3)5
求值:a = ((b - c) || (1 && 0)) == a = (3 - 4) || 0 == a = (-1 || 0) == a = 1

我对于E选项的运算顺序存疑惑,其中有两个逻辑判断,为什么不使用短路求值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 10:11 | 显示全部楼层
关于表达式 a = b - c || a % b && c / d(假设 a=1, b=2, c=3, d=4),以下是根据 C 语言运算符优先级的详细解释。

1. 运算符优先级顺序
在 C 语言中,该表达式的运算符优先级从高到低为:
  • 算术运算符 %/(同级,左结合)
  • 算术运算符 -(减法)
  • 逻辑运算符 &&(优先级高于 ||
  • 逻辑运算符 ||
  • 赋值运算符 =

因此,表达式等价于:a = ((b - c) || ((a % b) && (c / d)))

用括号和数字序号表示运算顺序(序号表示运算符的执行顺序,基于优先级,不考虑短路):
  1. a = ((b - c)4 || ((a % b)1 && (c / d)2)3)5
复制代码

注意:赋值运算符 = 在最后执行,通常不单独编号。

2. 口算求值(考虑短路求值)
代入 a=1, b=2, c=3, d=4:
  • 先计算 || 的左操作数 b - c:2 - 3 = -1(非零,在 C 语言中视为“真”)。
  • 由于逻辑或 || 采用短路求值,左操作数为真时,右操作数 a % b && c / d 不会被计算。
  • 整个 || 表达式的结果为 1(真)。
  • 赋值给 a:a = 1。

因此,表达式的最终值为 1

3. 关于短路求值的说明
短路求值发生在运行时,不影响优先级决定的表达式结构。在本表达式中:
  • 优先级决定了分组:a % b && c / d 作为整体是 || 的右操作数。
  • 求值顺序从左到右:先计算 b - c,因其为真,直接跳过右操作数,所以 a % bc / d 实际未计算。
  • 若不考虑短路,按优先级计算的结果相同,但短路提高了效率。


综上,表达式 a = b - c || a % b && c / d 的值为 1,且短路求值确实被使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-14 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表