C陷阱与缺陷之词法陷阱

该文章及后续文章均为阅读《C陷阱和缺陷》后的读数笔记,方便以后回顾

C陷阱和缺陷电子版图书下载地址:点击打开链接

第一章词法陷阱

1.1 = 不同于 ==

在C语言中,符号=作为赋值运算符,符号==作为比较运算符。一般而言,赋值运算相对比较运算出现得更频繁,因此字符数较少的符号=就被赋予更常用的含义——赋值操作。在编写程序的时候,注意不要将赋值操作写完比较相等的操作,也不要将比较操作写为赋值操作。

1.2 & 和 | 不同于 && 和 ||

在C语言中,&和|为按位运算符,它们对操作数的处理方式是将其视为一个二进制的位序列,分别对其每位进行操作。

&&和||为逻辑运算符:其处理结果通常为“真”或者“假”,&&和||运算符在其左侧操作数能够确定最终结果时根本不会对右侧操作数求值。

1.3 词法中的“贪心法”

C语言中既存在单目运算符,也存在多目运算符。那么当编译器读入一个字符‘/‘后又跟一个字符‘*‘时,那么编译器就必须判断是将其作为一个符号,还是作为两个分别的符号对待。C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略有时被称为“贪心法”。

这样就解释了为什么表达式a---b的含义与a-- -b相同,而与a---b不同。

1.4 整型常量

如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数。因此10和010所表示的数字截然不同。

1.5 字符和字符串

C语言中字符和字符串含义迥异,用单引号引起的一个字符实际代表上代表一个整数;整数值对应于该字符在编译器采用的字符集中的序列值,一般是ASCII字符集

用双引号引起的字符串,代表的却是一个指向无名字符数组起始字符的指针,该字符数组被双引号之间的字符以及一个额外的二进制值为0的字符‘\0‘初始化。

C陷阱与缺陷之词法陷阱

时间: 2024-10-11 17:37:25

C陷阱与缺陷之词法陷阱的相关文章

C陷阱与缺陷之语法陷阱

2.1理解函数声明 不论什么C变量的声明都由两部分组成:类型以及一组类似表达式的声明符号.比如 float f; 这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类.由于声 明符与表达式的相似.所以我们也能够在声明符中随意使用括号: float ((f)) 这个声明的含义是:当对其求值时,W)的类型为浮点类型,由此能够推知,f也是浮点类型.类似的. float *g(),(*h)(); 表示*g()与(*h)()是浮点表达式. 由于()结合优先级高于*.*g()也就是*(g()):g是

C陷阱与缺陷 —— 读书笔记-1、词法“陷阱”

<C陷阱与缺陷>是由Andrew Koenig所著,高巍译.Andrew Koenig是AT&T大规模程序研发部(前贝尔实验室)成员,不仅有着多年的C++开发,研究和教学经验,而且还亲身参与了C++的演化和变革,对C++的变化和发展起到重要的影响. 第一章    词法陷阱 编译器中负责将程序分解为一个一个符号的部分,一般称为"语法分析器". 1.1    = 不同于 == while (c='' || c==' ' || c==' ') c=getc(f); 这个循

我的《C陷阱与缺陷》读书笔记

第一章 词法"陷阱" 1. =不同于== if(x = y) break; 实际上是将y赋给x,再检查x是否为0. 如果真的是这样预期,那么应该改为: if((x = y) != 0) break; 2. &和| 不同于 && 和 ||   3.词法分析中的"贪心法" 编译器将程序分解成符号的方法是:从左到有一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符床是否可能是一个符号的组成部分:如

阅读《C陷阱与缺陷》的知识增量

看完<C陷阱与缺陷>,忍不住要重新翻一下,记录一下与自己的惯性思维不符合的地方.记录的是知识的增量,是这几天的流量,而不是存量. 这本书是在ASCI C/C89订制之前写的,有些地方有疏漏. 第一章 词法陷阱 1.3 C语言中解析符号时使用贪心策略,如x+++++y将被解析为x++ ++ +y,并编译出错. 1.5 单引号引起的一个字符代表一个对应的整数,对于采用ASCII字符集的编译器而言,'a'与0141.97含义一致. 练习1.1 嵌套注释(如/*/**/*/)只在某些C编译器中允许,如

读书笔记--C陷阱与缺陷

要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看  C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将书中重要的知识点和易错点记录下来方便自己复习和他人学习~~不多说了,下面开始. 第一章:词法陷阱 在C语言中,符号(程序文字)之间的空白(包括空格符.制表符.换行符)将被忽略.书中举了一例: 1 if (x > big) big = x; 2 可以写成: 3 if 4 ( 5 x 6 > 7 bi

C陷阱与缺陷学习笔记

本书的介绍 作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作.写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍. 全书分为8章,分别从词法分析.语法语义.连接.库函数.预处理器.可移植性缺陷等几个方面分析了C编程中可能遇到的问题.最后,作者用一章的篇幅给出了若干具有实用价值的建议. 本书适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备书籍. 前言 N年读过这本书

《C陷阱与缺陷》学习笔记(一)

前言和导读 "得心应手的工具在初学时的困难程度往往超过那些容易上手的工具."比较认同这句话.我至今觉得自己其实还是个刚入了门的初学者. 第一章 "词法"陷阱 由于之前学过编译原理,对编译器词法分析(主要是符号识别过程)比较了解,理解起来不困难. 在讲到"="和"=="."|"和"||"."&"和"&&"时,联想起以前见过一些

读书笔记--C陷阱与缺陷(七)

第七章 1.null指针并不指向任何对象,所以只用于赋值和比较运算,其他使用目的都是非法的. 误用null指针的后果是未定义的,根据编译器各异. 有的编译器对内存位置0只读,有的可读写. 书中给出了一种判断编译器如何处理内存0的代码: 1 #include <stdio.h> 2 int main() 3 { 4 5 char *p; 6 p=NULL; 7 printf("location 0 contains: %d\n", *p); 8 9 return 0; 10

《C陷阱与缺陷》读书笔记

<C陷阱与缺陷>读书笔记 1.编译器中的词法分析器负责将程序分解为一个个符号.C语言中,符号之间的空白 (包括Space ,Tab , Enter) 都将被忽略,但一个符号的中间不能有空白,否则可能被解释成为另一个或几个符号. 2.编译器将程序分解成符号的方法是从左到右逐个字符读入,如果该字符可能会组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分:如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已经不再可能组成一个有意义的