原创
嵌入式微控制器C语言学习笔记14-《C陷阱与缺陷》第3章
第3章 语义“陷阱”
●指针与数组
C语言中只有一维数组,然而数组的元素可以是任何类型的对象,当然也可以是另外一个数组。
任何一个数组下标运算都等同于一个对应的指针运算,因此可以完全依据指针行为定义数组下标行为。
任何指针都是指向某种类型的变量。给指针加上一个整数,与给该指针的二进制数表示加上同样的整数,两者含义截然不同。
*(a+i)即数组a中下标为i的元素的引用,被简记为a。用带方括号的下标方式明显要比完全用指针来表达简便的多。
试图将一种类型的指针赋值给另一种类型的指针是非法的。
●非数组的指针
在C语言中,字符串常量代表了一块包括字符串中所有字符以及一个空字符('\0')的内存区域的地址。
●作为参数的数组声明
在C语言中,如果使用数组名作为参数,那么数组名会立刻被转换为指向该数组第一个元素的指针。
C语言会自动地将作为参数的数组声明转换为相应的指针声明。
如果一个指针参数并不实际代表一个数组,即使从技术上而言是正确的,采用数组形式的记法经常会起到误导作用。
●避免“举隅法”
C语言中一个常见的陷阱:混淆指针与指针所指向的数据。复制指针并不同时复制指针所指向的数据。
●空指针并非空字符串
编译器保证由0转换而来的指针不等于任何有效的指针。
当将0赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存中存储的内容。
●边界计算与不对称边界
C语言中一个拥有n个元素的数组,却不存在下标为n的元素,它的元素的下标范围是从0到n-1为止。
对于像C这样的数组下标从0开始的语言,不对称边界给程序设计带来的便利尤其明显:这种数组的上界(即第一个“出界点”)恰是数组元素的个数。
●求值顺序
C语言中只有四个运算符(&&、||、?:、和,)存在规定的求值顺序,其它所有运算符对其操作数求值顺序是未定义的。
●运算符&&、||和!
按位运算符&、|和~对操作数的处理方式是将其视作一个二进制的位序列,分别对其每个位进行操作。
逻辑运算符&&、||和!对操作数的处理方式是将其视作要么是“真”,要么是“假”。
●整数溢出
当两个操作数都是有符号整数时,“溢出”就有可能发生,而且“溢出”的结果是未定义的。当一个运算的结果发生“溢出”时,作出任何的假设都是不安全的。
●为main函数提供返回值
大多数C语言实现都通过函数main的返回值来告知操作系统该函数的执行是成功还是失败。
文章评论(0条评论)
登录后参与讨论