第一章:词法陷阱

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

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. Spring Boot 系列教程1-HelloWorld

    入门 如果你用过Spring JavaConfig的话,会发现虽然没有了xml配置的繁琐,但是使用各种注解导入也是很大的坑, 然后在使用一下Spring Boot,你会有一缕清风拂过的感觉, 真是爽的 ...

  2. linux系统定时重启tomcat

    #touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...

  3. StringWriter/PrintWriter在Java输出异常信息中的作用

    闲来无事,看看JUnit的源代码.刚刚开始看就发现一段有趣的代码: public String trace() { StringWriter stringWriter = new StringWrit ...

  4. CentOS6下配置Django+Apache+mod_wsgi+Sqlite3过程

    0. 安装环境: CentOs版本:      VMWare中CentOs 6.4 Apache版本:      Httpd 2.2.15 http://httpd.apache.org/ Sqlit ...

  5. 转:LoadRunner中参数化技术详解

    LoadRunner中参数化技术详解 LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提 ...

  6. PAT1006

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  7. android studio sexy editor性感编辑器设置

    sexy editor下载地址:http://download.csdn.net/detail/yy1300326388/9166223 我自己也有上传CSDN资源 rainyday0524@163. ...

  8. Ubuntu和Redhat(Debian)的差别

    这两个最大的区别在包管理模式上. 都是用的Linux核心构架的. Redhat主要集中在 企业级服务器版的制作 是推动LINUX商业化最成功的公司 Redhat对应的桌面版制作 都是由Fedora社区 ...

  9. java删除文件夹 Java中实现复制文件或文件夹

    删除文件夹 import java.io.File; public class DeleteDir { /** * @param args */ public static void main(Str ...

  10. UIApplication,UIWindow,UIViewController,UIView(layer)

    转载自:http://www.cnblogs.com/iCocos/p/4684749.html UIApplication,UIWindow,UIViewController,UIView(laye ...