《C陷阱与缺陷》第一章部分问题汇总思考

道阻且长,行则将至。埋头苦干,不鸣则已,一鸣惊人!加油,骚年!

1 练习 1-3

1.1 题目信息

  题目如下:

为什么 n-->0 的含义是 n-- > 0,而不是 n- -> 0?

1.2 题目思考

  编译器是按照从左到右的顺序依次找到匹配的运算符,个人认为 n- 没有实际意义,只有 n-- 才有实际意义,并且 -> 貌似是指针的一种用法,一般没有这样用的。

1.3 书本答案

  根据 “大嘴法” 规则,在编译器读入 > 之前,就已经将 -- 作为单个符号了。

1.4 补充说明

  • 什么是 “大嘴法” 规则?

  编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。

  这个处理策略有时被称为 “贪心法” ,或者,更口语化一点,称为 “大嘴法” 。

2 练习 1-4

2.1 题目信息

  题目如下:

a+++++b的含义是什么?

2.2 题目思考

  一般我不会这样写,如果非要说这句话的含义,按照大嘴法分析,应该是 a++ ++ + b ,也就是 ((a++)++) + b ,但是貌似这样用不太行。

2.3 书本答案

  书本的答案解释,也是按照步骤分析的,下边来看看:

  • 上式中唯一有意义的解析方式是: a++ + ++b ,写的更清楚一点就是 (a++) + (++b)
  • 可是,如果我们根据大嘴法分析,结果应该跟思考的那样,即: a++ ++ + b ,也就是 ((a++)++) + b
  • 但是,这个转换后的 “合法” 的式子,从语法上来说是不正确的
((a++)++) + b
  • 为什么? a++ 的结果不能作为左值,因此编译器不会接受 a++ 作为后面的 ++ 运算符的操作数。这样,如果我们遵循了解析词法二义性问题的规则,上例的解析从语法上来说又没有意义。
  • 当然,在编程实践中,谨慎的做法就是尽量避免使用类似的结构,除非编程者非常清楚这些结构的含义。

3 总结

  • 简单了解了 “大嘴法” 规则;
  • 明白了编译器在识别符号时的基本顺序等;
  • 了解了一些坑,后续应该要避免去踩坑;

如果文章内容有误,麻烦评论/私信多多指教,谢谢!如果觉得文章内容还不错,记得一键三连哦(点赞、收藏、留言),您的支持就是对我最大的鼓励,谢谢您嘞!

猜你喜欢

转载自blog.csdn.net/Fighting_Boom/article/details/107203276