3.语义陷阱
- 指针与数组
- C语言中只有一维数组,数组大小必须在编译器就作为一个常数确定下来。
- C语言中数组的元素可以是任何类型的对象。
- 对于一个数组我们只能够做两件事
- 确定数组的大小
- 以及获得指向该数组下标为0的元素的指针
- 非数组的指针
- 字符串常量
- 一块包括字符串所有字符以及一个空字符\0’的内存区域地址。
- 作为参数的数组声明
- 我们没有办法将一个数组作为函数参数直接传递,只能够使用函数名作为参数,是将数组的首地址传递。
- 个指针参数并不实际代表一个数组。
- 避免举偶法
- 混淆指针与指针所指向的数据
- 复制指针并不同时复制指针所指向的数据
- 空指针并非字符串
- 0指针被转换成指针使用时这个NULL指针不能够被解除引用
- 我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向的内存存储的内容
- 边界计算和不对称边界
- —个拥有N个元素的数组,不存在下标为N的元素,他的元素下表范围在O-N-1为止。
- 栏杆错误/差—错误
- 首先虑最简单的情况下的特例,然后将所得到的结果外推
- 仔细计算边界,绝不掉以轻心
- 编程技巧
- 用第一个入界点和第一个出界点来表示一个数值范围
- 不对称边界
- 入界点在范围中,但出界点不再范围之中
- 取值范围的大小就是上界与下界之差
- 特例外推仔细计算边界
- 求值顺序
- 存在规定的求值顺序
- &&||先对左侧操作数求值 , 有需要时才对右侧操作数求值
- a? b:c操作数a首先被求值,根据a的值再求操作数b或c
- 逗号运算符,首先对左侧操作数求值,该值被丢弃,再对右侧操作数求值
- 赋值运算符=并不保证任何求值顺序
- 运算符&& || !
- 整数溢出
- 有符号运算
- 溢出的发生
- 无符号运算
- 没有溢出所有的无符号运算都是以2的n次方为模
- 一方为有符号一方为无符号数进行运算,都会转换成无符号数进行运算。
- 为函数mian提供返回值
- 返回O代表成功
- 非O代表程序执行失败
- 推荐一个零声学院免费教程,个人觉得老师讲得不错, 服务器课程