IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C陷阱与缺陷知识点复习 -> 正文阅读

[C++知识库]C陷阱与缺陷知识点复习

C陷阱与缺陷知识点复习

在复习的过程中结合自己的经验增加了一些解读,如有错误,请多多指正(鞠躬)

词法分析中的贪心法:

当语句中出现了多个字符,该如何处理?

一句话:每一个符号应该包含尽可能多的字符 如a+++b; 这个语句 意思就是a++ + b;

从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个字符串的组成部分;如果可能则继续读入下一个字符,重复以上操作。直到读入的字符组成的字符串不再可能组成一个有意义的符号。这就是所谓的词法分析中的贪心法。

p.s. 多元运算符的中间不得出现空格,否则贪心法失效,空格分开的是独立的运算符。

同样的,自己再写程序的过程中遇到连续字符很多的情况下担心分不清楚运算符,可以在写程序的过程中用空格隔开。

整型常量

最好使用标准的方法表示整型数,不要轻易以0开头(比如为了数字格式的整齐),可能会被编译器理解为八进制数字。

字符与字符串

单引号表示下的字符表示一个整数,整数值对应该字符在编译器中采用的字符集中的序列值。比如,对于严格使用ASCII字符集的编译器而言,'a’与十进制整数97同理;

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

切记,字符串此时代表指针,是由于保存字符串的数组是一段连续的内存空间,很多人甚至书籍将数组与指针等价,其实这是不对的,虽然很多情况下可以这么理解,后面会有总结。

但是!!! 由于整数型的存储空间可以容纳多个字符,因此有的C编译器允许在一个字符常量中包含多个字符比如说用’yun’代替字符串"yun"在很多编译器下是不会报错的。后者"yun"意味着’y’,‘u’,‘n’和’/0’四个字符组成,但是前者只是’y’,‘u’,'n’三者数值的叠加,如果在结果上来看有什么相似之处,那纯属巧合。

关于声明的理解

众所周知,变量声明是这样的:int a;

任何C变量的声明都由两部分组成:类型 以及一组类似于表达式的声明符;

这里的a通常被我们称之为表达式。词句话的意思是定义了一个int 类型的数据,为a;

既然类型后面的内容是表达式,所以其实我们也可以这么写:int ((a));

这句话的意思是:((a))的运算结果是int类型数据;

以此类推,int func();的意思就是func()的运算结果(函数运算的运算结果是返回值)是int类型数据,现在这么看是不是豁然开朗了(笑

这是函数声明,我们再看一看指针,指针也可以这么理解,int *p;

众所周知,*是一个运算符,可以表示乘法运算,也可以有地址的取内容符的意思。所以int *p;的意思就很明显了。对p取内容的结果是int类型,所以反推,p就是int类型的指针。

如何获取类型转换符

上一条已经讲了声明的方法,所以同理,取得强制转换的表达式:

float (*h)();

这句话表示h是一个“指向返回值为浮点类型的函数的指针”

因此,去掉表达式的名字,去掉语句最后的分号,将所得到的结果用一个小括号包裹起来,就得到了类型的转换符。

(float (*)());

表示一个“指向返回值为浮点类型的函数的指针”的类型转换符。

运算符优先级

运算符的优先级有15个之多,由于记忆起来太过不方便,所以有如下规律:

1,优先级比单目运算符要低的,接下来就是双目运算符

2,在双目运算符之中,算数运算符的优先级最高,移位运算符次之,关系运算符再次之

3,接着是逻辑运算符,赋值运算符,最后是三目运算符。

最重要的两点是:

1,任何一个逻辑运算符的优先级低于任何一个关系运算符。

2,移位运算符的优先级比算数运算符的优先级要低,但是要比关系运算符高。

悬挂“else”引发的问题

我们都知道,如果不进行括号的包装,条件语句和循环语句都默认在语句之下的那一行作为条件语句或循环语句的内容,但是有关键的问题,即else始终与同一括号内最近的未匹配的if相结合。

所以我们可以知道,当出现条件语句嵌套时,不加括号的省略方式很容易出问题。

指针与数组

  • C语言中的数组只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。不过,由于C语言中的数组中的元素可以是任何类型的对象,这个任何类型的对象包括另一个数组。

  • 对于一个数组,我们只能做两件事:确定数组的大小,以及获得该数组下标为0地方的指针。其他的操作诸如曾删改查等等,其实本质上就是指针的变化,可以说,任何一个数组下标的运算都是相应的指针的运算。

除了sizeof(数组名)运算代表所求为整个数组所占的内存,其他的时候,数组的名字都代表着数组下标为0的地址的地址。

由于这个特点,所以a[i]等价于*(a+i);又由a+i等价于i+a所以同理a[i]与i[a]等价

非数组的指针

在使用malloc函数分配内存的时候,如果要存储的对象是字符串,那么,malloc函数里的整型参数不能只是strlen函数的返回值,还得+1,因为strlen函数的返回值没有包含空字符’/0’。

作为参数的数组声明

由于数组名的含义是这个数组首元素的地址。所以将数组作为参数传递给函数,并没有什么大的意义。所以编译器会自动将作为参数的数组的声明转换成相应的指针声明。

但是切记,只有在数组做参数的情况才出现这种自动类型转换,在别处不可能这么使用。

避免“举隅法”

“举隅法”类似于同义词替换,就是含义更广的词来替换含义相对较窄的词语,或者相反,即以整体取代部分或者是以部分取代整体。

C语言中常见的错误:混淆指针与指针所指向的数据。

比如说,

char *p,*q;
p = "xYz";

这种情况其实并不是将字符串赋给了指针p,而是将字符串的首地址赋给了p

尤其要注意,复制指针并不是复制指针所指的数据。而是进行地址上的复制。

空指针并非空字符串

在C语言之中,将一个整数转化为一个指针的操作取决于编译器自身,其中的例外便是数字0,将数字0转化的指针不会有任何意义,所以通常情况下,编译器会将之转化为NULL空指针。

出于代码文档化的考虑,常数0这个值经常用一个符号来代替。

#define NULL 0

当然无论是使用NULL或是使用常数0,其结果大致相同,需要记住的重要一点是:当常数0被转化为指针使用的时候,这个指针绝对不可以解除引用。换句话说,在将0或NULL赋给一个指针变量后,我们绝对不可以企图使用该指针指向的内存中所储存的内容。

//该语句合法
if(p==(char *)0)
//该语句不合法
if(strcmp(p,(char *)0)==0)

原因是库函数strcpy()的实现会包含一个操作,用于查看它的指针参数所指向的内存中的内容。

边界计算与不对称边界(独立总结)

数组的下标问题,一个十个元素组成的数组,下标只有0到9,没有10。即为下标是从0到n-1;

这种设计有其便捷性;

求值顺序

不同于运算符的优先级,求值顺序有着不同的含义

C语言中只有四个运算符(&&、||、?:、以及,(逗号))有着特定的求值顺序

运算符&&和||首先对左侧操作数求值,只在需要时才对右侧操作数求值。运算符?:有三个操作数,a?b:c,这种情况先对a求值,然后根据情况来对b或c求值。

逗号运算符先对左侧求值,之后”丢弃”所求结果,对右侧求值。

分隔函数参数的逗号并非逗号运算符

//例如
func(x,y);
//这两个是函数的两个参数,没有运算关系
func((x,y));
//这个就是(x,y)运算结果做func函数的一个参数,需要先计算,后填入函数中作为参数,此时的逗号就是运算符。

(未完待续)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 11:43:20  更:2021-07-17 11:45:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 12:45:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码