C陷阱与缺陷阅读笔记

简介:

本文主要记录《C陷阱与缺陷》第三章中的一些知识。

一、指针与数组:

C语言数组特点:

(1)C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。由于数组的元素可以是任何类型的对象,当然也可是另外一个数组。这样,要“仿真”出一个多维数组就不是一件难事。

(2)对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向改数组下标为0的元素的指针。其他有关数组的操作,哪怕他们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算。

 

二、数组溢出:

  数组中实际不存在“溢界”元素的地址位于数组所占内存之后,这个地址可以用于进行赋值和比较;即:对于数组结尾之后的下一个元素,取它的地址是合法的。

 

三、一些运算符性质:

  运算符&&和运算符||首先对左侧操作数求值,只在需要时才对右侧操作数求值;

  运算符 ?: 有三个操作数,在a?b:c中,操作数a首先被求值,根据a的值再求操作数b或c的值;

  逗号运算符 , 首先对左侧操作数求值,然后该值被“丢弃”,再对右侧操作数求值;

  赋值运算符 = 并不保证任何求值顺序。

 

四、判断整数相加溢出

  在无符号算术运算中,没有所谓“溢出”一说。如果算术运算符的一个操作数是有符号整数,“溢出”也不可能发生。

  检查a+b是否溢出:

if((unsigned)a + (unsigned)b > INT_MAX)
    error();
或者:
if(a > INT_MAX - b)
error();

INT_MAX是一个已定义的常量,代表可能的最大正整数值,ANSI C标准在<limits.h> 中定义了 INT_MAX

目录
相关文章
|
7月前
|
存储 自然语言处理 编译器
C陷阱与缺陷
C陷阱与缺陷
31 0
C陷阱与缺陷
|
存储 人工智能 自然语言处理
【C缺陷与陷阱】----语义“陷阱”
那获得该下标为0的元素的指针,如果给这个指针加1,就能得到指向该数组中下一个元素的指针。也就是指针+一个整数得到的还是指针,只不过指针的位置发生改变
80 0
|
编译器 C语言
源于《C陷阱与缺陷》----研究程序死循环问题
所以最后答案应该就是打印了12次xiao tao,然后越界访问出现错误,使arr[10]=0,arr[11]=0了 但最后答案却不是这样。
81 0
|
算法 Oracle Java
深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」
深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」
110 0
|
自然语言处理 编译器 C语言
|
自然语言处理 算法 编译器
|
自然语言处理 编译器 C语言
|
设计模式 IDE Java
谈谈过度设计:因噎废食的陷阱
本文将深入探索如下问题: - 为什么长期来看,设计模式相比过程式代码是更好的? - 什么情况下设计模式是有益的,而什么情况下会成为累赘? - 如何利用设计模式的益处,防止其腐化?
104 0
谈谈过度设计:因噎废食的陷阱
|
测试技术
软件测试面试题:软件测试的过程的V模型,说出它的缺点?
软件测试面试题:软件测试的过程的V模型,说出它的缺点?
146 0
|
NoSQL 测试技术 程序员
关于代码的那些低级错误,都是血泪的教训
无论你是初级工程师,中级工程师,高级工程师,甚至是全栈工程师、架构师,都是从零开使一步一步走出来的,想必都会犯过一些低级错误。 那些错误都是怎么发生的,如何避免发生错误呢,看看我们各位资深的程序员以自身为例,告诫我们敬畏每一段代码
5395 0