zoukankan      html  css  js  c++  java
  • 《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

  • 相关阅读:
    [windows菜鸟]C#中调用Windows API参考工具
    [windows菜鸟]C#中调用Windows API的技术要点说明
    [windows菜鸟]Windows API函数大全(完整)
    C#卸载加载到进程里的dll
    C# 防火墙操作之开启与关闭
    CMD命令行管道命令
    linux kernel elv_queue_empty野指针访问内核故障定位与解决
    U-Boot Driver Model领域模型设计
    linux I/O stack cache 强制刷新
    基于lcov实现的增量代码UT覆盖率检查
  • 原文地址:https://www.cnblogs.com/liuxiaoming/p/2640660.html
Copyright © 2011-2022 走看看