C陷阱与缺陷(1)

C陷阱与缺陷的介绍

  该书是由Andrew Koenig所著,一位c/c++领域的专家。作者在该书中道出了许多C语言编程中一些重要的经验教训。笔者我也是刚读这本书不久,但从中看到了我在C语言学习时常常犯的一些错误。该书并不只是一味的说教,而是使用很多具体的实例,语言也是直白生动,值得所有的C语言学习者阅读学习。下面我也将使用博客的形式,来记录我自己阅读时的,所思所想。如果在文章中,有语言表述不清,或者有内容讲解错误,欢迎评论区或者私信指正。

第一章    词法“陷阱”

  程序是由字符组成的,字符相当于英语中的字母,字母它在语句中并没有属于它的意思。由字母组成的单词是由它的意思的。在编程语言中,字符会组成不同的符号,这些符号有着它们的意思,但也如同单词在不同的语句环境中其意思也不同,符号在不同的上下文环境中的意思也会不同。举例:由“-”和“>”组成的字符序列->。该字符序列在不同的环境中,可能会代表运算符的意思,也可能会代表字符串的意思。

  编译器中负责将程序分解为一个一个的符号的部分,一般被成为“词法分析器”。在C语言中,将程序分解为一个一个符号时,会跳过符号与符号之间的空白(空格符、制表符和换行符)。

1.1  =不同于==

  “=”是赋值符号,是用来做赋值运算的;“==”是判断符号,是用来判断两个值是否相等的。在书写代码的时候,我们有时会误将赋值符号写为判断符号,导致程序出错。首先两者的返回值不同,赋值式子的返回值等于被赋值对象最终的值。而“==”符号式子的返回值,只有0和1之分,当符号两边相等是返回1,不相等时返回0。二者的误用,会使得我们很多需要通过它们返回值,来进行下一步的程序,最终输出错误的结果。但遗憾的是这种错误在有一些编译器中,是不会被提醒的,这就导致我们排查问题的难度加大。这里,我分享一个我自己的小经验。在需用使用“==”判断时,将常量写在左边,将变量写在右边,这样当我们将“==”错写为“=”时,会发生报错。

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

  &和|是按为运算符,是作用于补码的运算符号;&&和||是逻辑运算符,是进行逻辑判断的符号。二者虽然长得很相似,但是使用的方式,作用的地方也都不一样。不要将二者误用。

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

  在C语言中的符号由单个字符组成,但同时也有许多由多个字符组成,这些多个字符是由单个字符组成的,那我们编译器是如何判断程序中哪些单个字符是一个符号,哪些多个字符是一个符号?在处理这个问题时,采用的“贪心法”,及编译器将程序分解符号时,是从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那再度入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,在读入下一个字符,重复上述判断。直到读入的字符所组成的字符串不能可能再组成一个有意义的符号。前面我们提到词法分析器会忽略空白,因此在我们编写程序时,我们可以添加空白来改变读取符号,举例“a---b”我们可以通过添加空白实现不同的含义,“a-- - b”和“a - --b”的含义就不同。前者读取的符号分别为“-- 和 -”,后者为“- --”。但同时也需要警惕空白的使用,空白可能会使单个符号变为多个符号。

1.4  整型常量

  常量就是不可以改变的量,整型常量就是不可以改变的整型数据。我在初学这部分的时候,对于整型常量的八进制、十进制和十六进制的输入输出,不太明白。其实,所有的整型常量在计算机中都是以二进制的形式储存的,因为计算机只能识别二进制。所谓的八进制、十进制和十六进制的作用对象其实是我们自己,只是输入和输出的形式不同,本质上并没有什么区别。

1.5  字符和字符串

  字符需要由单引号引起,由单引号引起的字符实际上就代表一个整数,所代表的这个整数就是该字符在ASCII码表中所对应的序列值,这也是为什么我们常常说char(字符类型)是一种特殊的整型。

  字符串需要由双引号引起,由双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该无名数组被双引号之间的字符以及一个额外的二进制的‘\0’初始化。因此我们在输出一段字符串时就可以有两种方式。

  1.直接输出

2.使用指针来进行输出

编译环境(vs2022)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值