第一章:词法陷阱

编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”。例如,对于语句:

if ( x == big ) big = x ;

它的第一个符号是C语言关键字if,紧接着下一个符号是左括号,在下一个符号是标识符x,在下一个是大于号,在下一个是标识符big,以此类推。在C语言中,符号之间的空白(包括空格、制表符、换行符)将被忽略,因此上面的语句还可以写成:

if

(

x

==

big

)

big

=

x

;

这里还需要强调一下“C语言忽略符号间空白”。第一:“符号”的意思并不是“字母”,例如上面的语句中的“==”和“big”,它们都包含了多个字母,但是它们从整体上是一个符号,不可分割。第二:忽略符号与符号之间的空白,意即经过编译器的词法分析之后,符号与符号之间的空白不会被作为一个符号。但是,请注意的是,第二点并不意味着可以乱用空格,例如,在上面的语句中,“==”不可以写做“= =”,如果写成后者,便成了两个赋值号,程序的意思也就变了。

1.1 = 不同于 ==

前者是赋值,后者是判断相等,对于C语言初学者,很容易就犯误用的错误。

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

前两者是位运算,后两者是关系运算。

1.3 词法分析中的“贪心法”

C语言中的某些符号,例如/、*、和=,只有一个字符,称为单字符符号。而C语言中的其他符号,例如/*和==,以及标识符,包括了多个字符,称为多字符符号。那么当C语言的编译器的词法分析模块读入了一个字符‘/’后又跟了一个字符‘*’,那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号对待。C语言解决这个问题的方案很简单,那就是“贪心法”:每一个符号应该包含尽可能多的字符。

需要注意的是,除了字符串和字符常量,符号的中间不能嵌有空白(空格符、制表符和换行符)。例如,“==”是单个符号,而“= =”则是两个符号。例如下面的表达式:

a---b

那么按照“贪心法”,它的含义是:

(a--) - b

而:

a- --b

的含义是:

a - (--b)

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

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

而实际上,因为“贪心法”,上面语句中的x后面的/*会被C语言词法分析器理解为一段注释的开始。

正确的表达当如下:

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

或者更清楚一点:

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

1.4整型常量

021不同于21,前者是八进制,后者是十进制。

练习1-1 写一个测试程序,无论是对于允许嵌套注释的编译器还是对不允许嵌套注释的编译器,该程序都能够正常通过编译,但是两种情况下程序的执行结果却不相同。

答案: /*/*/0*/**/1

在允许嵌套注释的情况下,上式值为1;

在不允许嵌套注释的情况下,上式值为0*1;

C缺陷与陷阱----读书笔记---第一章的更多相关文章

  1. 《css3实战》读书笔记 第一章 基于CSS需求而编写的HTML.

    笔记说明 <CSS3实战手册第3版(影印版)>可以消除Web设计工作的痛苦,并且带给你:HTML--重新入门.如果你是HTML新手,你会学到如何以CSS友好的方式进行基本页面构造.若你是H ...

  2. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  3. Getting Started With Hazelcast 读书笔记(第一章)

    第一章:数据集群的演化与 早期的服务器架构 显然,应用是可扩展的,但是由于是集中式服务器,随着数据库性能达到极限,再想扩展就变得极端困难,于是出现了缓存.    缓存显然再次提升了可扩展性,减轻了数据 ...

  4. .net架构设计读书笔记--第一章 基础

    第一章 基础 第一节 软件架构与软件架构师  简单的说软件架构即是为客户构建一个软件系统.架构师随便软件架构应运而生,架构师是一个角色. 2000年9月ANSI和IEEE发布了<密集性软件架构建 ...

  5. 《C++ Primer》读书笔记 第一章

    读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...

  6. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游

    本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...

  7. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  8. 《从0到1》读书笔记第一章&quot;未来的挑战&quot;第2记:做老子还是做孙子

    从1到N VS 从0到1 - 别让自己的小鸡鸡抓在别人的手上 近几年国内互联网创业上非常流行一种C2C(也就是Copy to China - 复制到中国)的创业模式,打的就是一个时间差和地域差.将在国 ...

  9. C primer plus 读书笔记第一章

    写在前面: 算法和数据结构是计算机学习的基础,而大部分书籍是用C/C++编写.所以有了把C语言重新学一遍的想法.这个系列主要是记录看C primer plus的一些笔记和部分课后习题的答案,不会总结的 ...

随机推荐

  1. OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试

    片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...

  2. Java Networking Related (Java Examples in a Nutshell 3rd Edition)

    Examples to: Use URL class to parse URLs and download the network resources specified by a URL Use U ...

  3. db2导入表结构和表数据

    http://www.cnblogs.com/kfarvid/archive/2010/12/15/1906776.html   db2的博文 -bash-3.2$ db2 connect to ca ...

  4. hadoop中联结不同来源数据

    装载自http://www.cnblogs.com/dandingyy/archive/2013/03/01/2938462.html 有时可能需要对来自不同源的数据进行综合分析: 如下例子: 有Cu ...

  5. Linux学习 -- Shell编程 -- 正则表达式

    正则表达式与通配符 正则 -- 匹配字符串 -- 包含匹配     grep.awk.sed等 通配符 -- 匹配文件名 -- 完全匹配  ls.find.cp等 基础正则表达式

  6. IDL 实现PCA算法

    在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析.简化数据集的技术.主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特 ...

  7. HDU 5719 Arrange

    根据条件,某些位置的数字就可以确定了.确定过程中如果有冲突,则无解. 如果B中出现了递增,C中出现了递减,则无解. 对于每一个未确定的a[i],ans需要更新,ans=ans*((c[i]-b[i]+ ...

  8. Effective java -- 4 泛型

    第二十三条:请不要在代码中使用原生态类型就是像Set这种待泛型的,就把泛型明确写出来. 第二十四条:消除非受检警告就是Set<String> sets = new HashSet();这种 ...

  9. Memcached函数整理

    public bool Memcached::add ( string $key , mixed $value [, int $expiration ] )  向key中添加值,如果key存在,返回f ...

  10. Android Studio调试功能使用总结---转

    Android Studio调试功能使用总结[转]   这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此. 先编译好要调试的程序. 1.设置断点 选定要设置断点的代码 ...