[读书笔记] C 陷阱与缺陷

本文探讨了C语言编程中常见的陷阱与误区,包括错误的循环条件导致无限循环的问题,以及词法分析中的“贪心法”如何影响编译器解析。文章还提醒程序员注意八进制数的表示方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • =不同于==

下例中循环语句的本意是跳过文件的空格修饰符、制表符和换行符

  while(c=''||c=='\t'||c=='\n')
  {
  c
= getc(f);
  }

由于疏忽,误将运算符==写成赋值运算符=。因为赋值运算符=的优先级要低于逻辑运算符||,因此实际上是将以下表达式的值赋给了c

  ' '||c=='\t'||c=='\n'

因为' '不等于零(' '的ASCII码值是32)所以无论变量c之前是何值,上述表达式的结果都是1,因此循环一直运行下去,直到文件结束

  • 词法分析中的"贪心法"

当C编译器读入一个字符'/'后,又跟了一个字符'*',那么编译器就必须做出判断:是将其作为两个分别的字符对待还是合起来作为一个符号对待,C语言对这个问题的解决方案可以归纳为一个很简单的的规则:每个符号应该包含尽可能多的字符。

下面的语句本意似乎是x除以p所指的值,把所得的商赋给y:

  y = x/*p /* p指向除数*/

而实际上/*被编译器理解为一段注释的开端,编译器将不断的读取字符,直到*/出现,也就是说该语句直接将x赋给y,根本不会顾及后面出现的p,将上面的语句重写如下:

  y = x /*p;或者
  y
= x / (*p); //这才是程序员本意
特别注意:如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数!!

转载于:https://www.cnblogs.com/bdictator/archive/2010/03/20/ctrapsnpitfalls.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值