2025-03-25 学习记录--C/C++-C语言 while(ch = getchar(), ch != ‘#‘) 和 while(ch = getchar() && ch != ‘#‘) 的区别

C语言 while(ch = getchar(), ch != ‘#’) 和 while(ch = getchar() && ch != ‘#’) 的区别

C语言中,while(ch = getchar(), ch != ‘#’)while(ch = getchar() && ch != ‘#’) 这两种写法有本质区别,导致后者不能正确工作。以下是详细解释:👇🏻

1. 运算符优先级问题 🍭

逗号运算符 ,:🎀

先计算左侧表达式(ch = getchar()),再计算右侧表达式(ch != '#'),最后返回右侧的结果作为整个表达式的值。

逻辑与运算符 &&:🎀

优先级高于赋值运算符 =,所以 ch = getchar() && ch != '#' 会被解析为:

ch = (getchar() && (ch != '#'))

这会导致:👇🏻
1、先读取一个字符并判断其是否为真(非零)
2、再判断 ch != '#'(此时 ch 是未初始化的垃圾值)
3、将两个条件的逻辑与结果赋值给 ch

2. 实际行为对比 🍭

(1) 正确写法 ✅:while(ch = getchar(), ch != ‘#’) 🌈
while(ch = getchar(), ch != '#') {
    // 循环体
}

执行顺序:

  • 1、调用 getchar() 读取字符并赋值给 ch
  • 2、检查 ch != '#' 是否为真
  • 3、若为真则进入循环体
(2) 错误写法 ❎:while(ch = getchar() && ch != ‘#’) 🌂
while(ch = getchar() && ch != '#') {
    // 循环体
}
  • 实际解析为:👇🏻
while(ch = (getchar() && (ch != '#'))) {
    // 循环体
}
  • 问题:💥
  • ch 会被赋值为 01(逻辑与的结果),而不是字符本身。
  • ch != '#' 中的 ch 在第一次判断时是未定义的(可能为垃圾值)。

3. 示例验证 🍭

假设输入字符 A#

  • 正确写法 ✅:
    • 读取 'A'ch = 'A''A' != '#' 为真 → 进入循环
    • 读取 '#'ch = '#''#' != '#' 为假 → 退出循环
  • 错误写法 ❎:
    • getchar() 返回 'A'(ASCII 65,非零为真)
    • ch != '#' 中的 ch 是未初始化的值(垃圾值)
    • 逻辑与结果可能是 01(随机),导致行为不可预测

4. 解决方案 🍭

若想避免逗号运算符,可以改为:👇🏻

while((ch = getchar()) != '#') {
    // 循环体
}
  • 原理:
    • 明确优先级,先赋值再比较。

5. 关键总结 🍭

写法解析顺序赋值结果是否可用
while(ch = getchar(), ch != '#')先赋值,再比较ch=字符✅ 正确
while(ch = getchar() && ch != '#')先逻辑与,再赋值ch=0/1❌ 错误
while((ch = getchar()) != '#')先赋值,再比较ch=字符✅ 推荐

最佳实践:使用括号明确优先级,避免依赖运算符优先级规则。❀

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值