c陷阱与缺陷第一章

简介:

@[TOC]

前言:

博主实力有限,有什么错误,请你斧正,非常感谢!

博文属于<<c陷阱与缺陷>>专栏,后面会持续更新.

第一章 :词法陷阱

当我们对一段英语短句进行理解时,我们关注的是 单词,而不是 字母

同样对于c语言等编程语言所写的程序:当我们阅读一句程序时,并不考虑单个字符,而是对字符组成的符号进行理解。

1. 赋值运算符=与比较运算符==

对于赋值运算符 =:

如果用于逻辑判断时,其逻辑值是0或者非0值。

对于比较运算符==

其;逻辑值只有`0或者1

image-20210828093558597

2.按位与&,按位或|,逻辑且&&,逻辑或||

按位与&:

1.&是双目运算符
2.esp: a&b
其是对a与b的二进制补码中的每位进行比较运算。a或者b中只要一边二进制补码对应位中是0,那么新的二进制位对应位就为0
image-20210828100130555

按位或|

1.双目运算符
2.esp:a\ b
其是对a与b的二进制补码中的每位进行比较运算。a或者b中只要一边二进制补码对应位中是1,那么新的二进制位对应位就为1
image-20210828121652980

逻辑且&&

1.双目运算符
2.两边只要一边为假(0),表达式就为假。且具有改变运算性质的属性,
即(a&&b)一旦a为假,b表达式就不需要计算,逻辑判断最终结果直接为假
image-20210828122507486

逻辑或||

1.双目运算符
2.两边只要一边为真(1),表达式就为真。且具有改变运算性质的属性,
即(a&&b)一旦a为真,b表达式就不需要计算,逻辑判断最终结果直接为真
image-20210828122632907

3.词法分析中的“贪心法”

  • 对于比较运算符‘==’,在程序中,编译器是怎么判断出的。

规则如下:

编译器将程序分解成符号,从左到右一个一个字符读入,如果读入的字符组成的字符串是·有意义的符号,就继续读,直到读入的字符组成的字符串不能组成一个有意义的符号,那么该读入所组成的字符串即为一个符号。
exp1:a - - -b
1.读入a,继续读。读入-,"a-"不能在组成有意义符号,"a"做为符号
2.从第一个-读入,继续读,读完后组成字符串"--",继续读,"---",不能再组成一个符号。
3.从第三个'-',读入,再读入b,-b无意义,`'-'`做为一个符号
4. 读入b,无法再读,b做为符号
5.实际为 (a--)-(b)
exp2:y=x/*p
在读入'/'后,读入'*',再读入'p'/*p无意义符号。因此"/ *"做为注释符。
exp3:y=/ *p
在读入/ 后,==空格==读入,但是 ==/== 无意义。因此/做为除法符号.所以最后 原式即是 y= / (* p)

4.整形变量:

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

image-20210828125819359

5.字符与字符串

  • 用单引用引起的一个字符,实际是一个整形数。根据ASCII原则,每个字符对应一个十进制数。
  • 对与双引号引起的字符串,其实质:是一个无名数组起始字符的==指针==,该数组被双引号之间的字符以及一个额外的二进制为0的==字符串结束标志‘\0’初始化==
  • 因此单引号实质是整形,双引号实质是指针。混用时,编译器会检查出来。
  • 对于‘yes’这种是合法的,但是对于不同编译器,其对应整数不同

    Borland C++ v5.5和 LCC v3.6 中的做法是:忽略多余字符,最终整数值是 第一个字符的整数值.

    Visual C++ 6.0和 GCC v2.95中做法是:忽略多余字符,最终整数值是最后一个个字符的整数值.

    image-20210828131043300

6.练习

1.n-->0的含义是(n--) >0,还是 (n- ) ->。
2.a+++++b的含义是什么,以及其形式是否正确。

7. 解析

1.是 (n--)> 0;
贪心法中,"n-" 虽然有意义,但是需要继续读入,因此"--"做为自减符号,"-->"无意义符号
2((a++)++ )+b
但是对于++其必需修饰可改的值,而a++引用后是一个常量值,不符合规则。

对《c陷阱与缺陷》感兴趣的,请到网盘自行下载

链接:https://pan.baidu.com/s/1VV5xitjQPKAEHhLhyA3CBQ
提取码:2021

相关文章
|
8月前
|
存储 自然语言处理 编译器
C陷阱与缺陷
C陷阱与缺陷
31 0
C陷阱与缺陷
|
4月前
|
测试技术
常见测试陷阱
常见测试陷阱
|
6月前
|
存储 编译器 C语言
C语言编程陷阱:语义陷阱
C语言中只有一维数组,数组大小必须在编译器就作为一个常数确定下来。 C语言中数组的元素可以是任何类型的对象。
24 1
|
编译器 C语言
源于《C陷阱与缺陷》----研究程序死循环问题
所以最后答案应该就是打印了12次xiao tao,然后越界访问出现错误,使arr[10]=0,arr[11]=0了 但最后答案却不是这样。
82 0
|
存储 人工智能 自然语言处理
【C缺陷与陷阱】----语义“陷阱”
那获得该下标为0的元素的指针,如果给这个指针加1,就能得到指向该数组中下一个元素的指针。也就是指针+一个整数得到的还是指针,只不过指针的位置发生改变
80 0
|
自然语言处理 算法 编译器
|
自然语言处理 编译器 C语言

相关实验场景

更多