再读《C陷阱与缺陷》

 

这是大学的第一个暑假,我想在这个暑假里好好的学习一下,把前两个学期的知识在回顾一下,因此我决定再读一遍《C陷阱与缺陷》,这确实是一本相当好的书,我认为是学C者必看书籍之一,以下是我的读书笔记,会不断更新,如果断了就是没网了,开学会补上,希望对于学C的有所帮助吧。

 

 

 

第一章

 

1.  程序中的单个字符孤立起来看并没有什么意义,只有结合上下文才有意义。

 

你可以把写程序当做写作文似的。每一个“符号”是一个程序的基本组成单元,相当于一个句子中的单词,然后由单词组成句子,句子

 

组成文章,也就是说,“符号”组成语句,语句组成程序。符号是由字符序列组成,而字符序列在不同的上下文环境中的不同的符号,具有不同

 

的意义。在C语言中符号之间的空白符(空格、制表符、换行符)将被忽略。

 

 

 

2.  =&|不等于==&&||

 

C语言中,=代表赋值运算,==代表比较运算;&代表地址运算或者按位运算,&&代表逻辑运算(并且);|表示按位运算,||表示

 

逻辑运算(或)。这是与某写语言中不同的地方,在某些语言(例如:Pascal)中不仅将=作为赋值运算符,也作为比较运算符,&&||

 

别用andor表示。其中===最具代表性。例如下列语句:

 

 

 

本意是想比较xy的大小,如果相等则执行foo函数,而实际是将y的值赋予x然后检查该值是否为0,为了避免这种情况,有些程序员会在常

 

量与变量进行比较时将常量写在比较符号的左侧,当符号错误时就 会报错。而一定要将两个变量进行比较而不希望编译器发出警告时应该显

 

示的进行比较,即:

 

 

 

 


3.  “贪心法”。

 

“贪心法”也称“大嘴法”是C语言中对多字符符号进行区别的方法,规则很简单:每一个符号应该报好尽可能多的符号。除了字符串与字

 

符常量,符号的中间不能嵌有空白。例如a---ba -- - b相同而与a - --b不同。在例题中a+++++b表示a ++ + ++b,根据大嘴法为什么

 

不是a ++ ++ + b呢?这是因为a++不能作左值。

 

 

 

4.  字符代表数字 与 字符串指向无名数组起始字符的指针。

 

C语言中的单引号和双引号含义迥异,在某些情况下如果将两者混合,虽然编译器不会检测出错误,但在运行时会产生难以预测的结

 

果。单引号引起的一个字符实际上代表一个整数,整数的值对应于该字符在编译器采用的字符集中的序列值’a’代表97(十进制)。用双引


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

 

如:

 

printf(“Hello World”);

 

 

char h[]={‘H’, ’e’, ’l’, ’l’, ’o’, ’ ’, ’W’, ’o’, ’r’, ’l’, ’d’, ’/0’);

 

printf(h);

 

是等效的。如果你在程序中输入语

 

char *p=’a’;,那么编译时就会报错。因为’a’不是一个字符指针。但是编译器对函数的参数是不进行检查的,尤其是printf函数的参数,

 

如果用printf(‘/n’);来代替printf(“/n”);将会产生不可预料的错误。

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值