(一)、C语言陷阱之词法

1.0、说明

知识点从《C陷阱与缺陷》总结,但是不同于资料,某些知识点来源自自己的经验总结说明,所以在这里打上原创。

1.1、= 不同于==

在C语言中使用 = 作为赋值运算符,== 作为比较运算符,由于他们两个书写很相近,这就有可能导致一个潜在问题,就是导致误写,而误写的后果就是导致最终结果不一致,而且也有可能导致程序奔溃。

因为这两种写法对于编译器而言都是合法的,所以最多只会提出警告,所以在这,我们就要秉持零警告,零错误的态度去写代码。

因为往往很多警告其实就是我们逻辑出现错误,而语法没有出错,编译器给他的提醒。

1.2、&& || 和& |

这一组和上面一组很类似,一个是逻辑判断运算符,一个是操作运算符,两个使用起来条件差异很大,也是容易出现书写混乱而导致出现问题。

1.3、贪心法

贪心法指的是编译器在读取字符的时候,是作为一个字符对待还是分别别的字符,除了字符串和字符常量,符号的中间不能有空白,例如前面的 == 如果中间存在空白,则会形成两个字符。

例如下面的表达式:

a---b

和表达式

a -- - b

含义相同,但是和下面而不相同:

扫描二维码关注公众号,回复: 9516873 查看本文章
a- -- b

其实我们从这里也可以看得出来,不同符号之间的组合最终形成的结果不同,所以我们在写代码的时候,避免这种歧义的写法,能加括号的尽量加括号。

否则有可能出现下面这种情况:
在这里插入图片描述
我们想要实现的就是b除以一个数,只是这个数是通过指针取出来的,但是我们发现,这样写其实编译器检测到 /* 是一个字符,就是我们注释的符号,所以后面出现了注释。

我们加个空格区分开来即可,但是最好还是加上括号,防止歧义:
在这里插入图片描述

1.4、整形常量

关于进制主要有二进制、八进制、十进制、十六进制、其中八进制是在前面添加一个0作为八进制的表示如: 089。十进制就是我们通常写的,十六进制是加上0x。

但是这个时候八进制和十进制因为都是数字,所以很有可能本来写的十进制 1089,因为写的过程中漏写1,最终变成 089,这个就是八进制,这两者之间的差距产生非常大。

1.5、字符和字符串

在C语言中使用单引号和双引号进行区分字符和字符串,但是在某些情况下如果把两者弄混,编译器不会检测报错。

而且字符串在后面会添加一个 ‘\0’ 作为结束符,所以在拷贝的时候特别需要注意。

但是如果因为大意,写成这样:

	char *p = '/';

	printf("%s\n", p);

因为本意是写p为一个指针,但是给他赋值的是 一个字符,所以在格式化输出的时候,因为找不到 字符串的结束符 ‘\0’,而有可能出现程序奔溃。

1.6、练习题

1、a+++++b的含义是什么?

我们通过编译器测试一下:
在这里插入图片描述

直接这样写是报错的。

这样写也是报错的
在这里插入图片描述

只有这样写编译器才不会报错
在这里插入图片描述
其实也可以这么理解,就是编译器从左边进行检索,在检测到 ++的时候就认为是双目运算符了,因为 a++是不能当左值的,所以再遇到后面的 ++,是没办法运行的,而且剩余个 +b,编译器也不认识他,所以最终只能是 a++ + ++b。

发布了29 篇原创文章 · 获赞 0 · 访问量 408

猜你喜欢

转载自blog.csdn.net/weixin_42547950/article/details/104493563