博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C陷阱与缺陷(一)
阅读量:5239 次
发布时间:2019-06-14

本文共 1114 字,大约阅读时间需要 3 分钟。

第一章 词法陷阱

术语“符号”指的是程序的一个基本组成单元,其作用相当于一个句子中的单词。

编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”。

1.1 =不同于==

一般容易将比较运算误写成赋值运算的情形,另一方面,如果把赋值运算误写成比较运算,同样会造成混淆:

if((filedesc==open(argv[i],0))<0)
error();

在本例中,如果函数open执行成功,则返回0或者正数;而如果函数open执行失败,将返回-1。

上面这段代码的本意是将函数open的返回值存储在变量filedesc之中,然后通过与0比较来检查函数open是否执行成功。
而按照上面的代码是比较open的返回值与变量filedesc,然后检查比较的结果是否小于0。
但是结果只可能是0或1不可能小于0,所以函数error将没有机会被调用。

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

前两者是按位运算符,而后两者是逻辑运算符。

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

C语言中的一个简单规则:每一个符号应该包含尽可能多的字符。也就是从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。这个处理策略称为“贪心法”。

需要注意的是,除了字符串与字符常量,符号的中间不能嵌有空白。
例如y=x/*p   本意是用x除以p所指向的值,再把所得商再赋给y。而实际上,/*被编译器理解为一段注释的开始,编译器将不断地读入字符,直到*/出现为止。
应改写为y=x / *p 或者y=x/(*p)

1.4 整型常量

如果一个整型常量的第一个字符是数字0,那么该常量将被视作八进制数。

因此10与010的含义截然不同。

1.5 字符与字符串

C语言中的单引号与双引号含义迥异。

用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。
用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符‘\0’初始化。
如果两者混用,那么编译器的类型检查功能将会检测到错误。例如char *slash='/';

C语言定义并不允许嵌套注释,这样的话一个依赖嵌套注释的程序在很多编译器上将无法通过。

a+++++b的含义是什么? 它惟一有意义的解析方式是:a++ + ++b

因为a++的结果不能作为左值,因此编译器不会接受a++作为后面的++运算符的操作数。

转载于:https://www.cnblogs.com/tuifeideyouran/p/3139181.html

你可能感兴趣的文章
maya 操作自我整理(二)
查看>>
架构师最怕程序员知道的10件事
查看>>
vue table-tree 组件
查看>>
3-Longest Substring Without Repeating Characters @LeetCode
查看>>
php curl 域名解析到指定IP -- clwu
查看>>
mediamind 组件
查看>>
SqlHelper发布—比Pagehelper更好用的分页插件
查看>>
Java-垃圾收集
查看>>
TWaver局部自动布局及嵌套Group处理
查看>>
39、python模块学习-logging模块
查看>>
Uber优步北京第四组奖励政策
查看>>
算法之 栈的顺序结构
查看>>
【一次面试】再谈javascript中的继承
查看>>
OpenStack cloud 第一天
查看>>
tomcat部属项目时报错:An internal error occurred during Add Deployment.java.lang.NullPointerException...
查看>>
pandas
查看>>
amoeba连接mysql--ERROR 2006 (HY000): MySQL server has gone away
查看>>
http://overapi.com/
查看>>
游戏生命周期和新服的关系
查看>>
gitlab与gitlab服务器之间的代码迁移
查看>>