读《C语言陷阱与缺陷》一书后的一些注意事项

2024-05-19 10:32

本文主要是介绍读《C语言陷阱与缺陷》一书后的一些注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.一般而言,赋值运算相对于比较运算出现得更频繁,因此字符数较少的符号=就被赋予了更常用的含义——赋值操作


2.' '不等于零(' '的ASCII码值为32)


3.需要注意的是,除了字符串与字符常量,符号的中间不能嵌有空白(空格符,制表符和换行符)。例如,如果/是为了判断下一个符号而读入的第一个字符,而/之后紧接着* , 那么无论上下文如何,这两个字符都将被当做一个符号

而实际上,出现为止。也就是说,该语句直接将x的值赋给y,根本不会顾及后面出现的p。将上面的语句重写如下:

                          y=x  /  *p     

或者更加清楚一点,写作:

                          y=x/(*p)       


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


5.用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。因此,对于采用ASCII字符集的编译器而言,'a'的含义与0141(八进制)或者97(十进制)严格一致;用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符‘\0’初始化


6.C语言中有这样的规则,else始终与同一对括号内最近的未匹配的if结合。例如下面这段代码:

                       if (x==0)

                                     if(y==0)     error();

                        else{

                                     z=x+y;

                                    f(&z);

                        }

实际被执行的时候相当于:

                        if(x==0)    {

                                      if (y==0)

                                                 error();

                                       else{

                                                 z=x+y;

                                                 f(&z);

}

}


7.在写C语言的时候,注意使用不对称边界


8.严格的规则是,每个外部变量只能够定义一次。

int  a ;

如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部的整型变量,同时为a分配了存储空间。

int  a =7 ;

在定义a的同时也为a明确指定了初始值。这个语句不仅为a分配内存,而且也说明了在该内存中应该存储的值。

extern  int  a ;

并不是对a 的定义。这个语句仍然说明了a是一个外部整型变量,但是因为它包括了extern关键字,这就显式的说明了a的存储空间是在程序的其它地方分配的


9.static修饰符是一个能够减少此类命名冲突的有用工具。例如,一下声明语句

             static   int  a ;

其含义与下面的语句相同

              int   a ;

只不过, a 的作用域限制在一个源文件内,对于其它源文件,a是不可见的。


10.事实上,ANSIC标准所能保证的只是,C实现必须能够区别出前6个字符不同的外部名称。而且,这个定义中并没有区分大写字母与其对应的小写字母。因为这个原因,为了保证程序的可移植性,谨慎地选择外部标识符的名称是重要的。比方说,两个函数的名称分别为print_fields与print_float,这样的命名方式就不恰当;同理,使用State与STATE这样的命名方式也不明智




关注微信公众号获取更多资讯


这篇关于读《C语言陷阱与缺陷》一书后的一些注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995823

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码