• C 中需要注意的问题!


    1. 数据下标溢出问题  

      编译器不对数组下标做合法性检查。因此,编写程序时,如果下标值是从那些已知是正确的值计算得来,那么无需检查它的值;但是,如果下标是依据某种方法从用户输入的数据产生而来,那么使用前必须进行合法性检测,确保其不会越界。

    2.typedef 与 #define

      使用typedef可以定义数据类型的新名字,这样,当你需要修改程序类某些数据的类型时,将减少工作量和错误率。

      #define 只是在编译时进行字面替换,某些情况可能会出现很难检测的错误。

        如:      typedef  char *  prt_to_char   //把标识符ptr_to_char作为指向字符的指针类型的新名字

            #define   prt_to_char_bad  char *  //编译时prt_to_char_bad被替换为char*

            prt_to_char a, b;   // 声明a, b是指向字符的指针变量

            prt_to_char_bad c, d;   //声明c是指向字符的指针变量, 而d是字符型变量

    3.作用域、链接属性和存储类型

    变量的位置 变量类型 存储位置 作用域 如果声明为static
    所有代码块之外 全局,其他源文件可以访问,其他源文件中声明时建议加上extern,用以标明访问此处的外部变量。 静态存储区,初始化为0 从声明处到文件尾  不允许从其他源文件访问
    代码块起始处  局部变量 堆栈,初始值无意义 整个代码块 存储在静态存储区,程序执行期间一直保持。也不能从其他源文件访问。当多次调用该函数时,上一次调用函数产生的值会传递给下一次调用。
    函数头部 形式参数 堆栈 整个函数 不允许

      

    4. switch (expression):  expression 的结果必须为整型值。

    5.有符号数的右移操作不可移植!!!

    6. EOF为整型, 输入EOF(在 Windows/MS DOS 系统下:新起一行,按住 ctrl ,然后再按下 z ;在 Unix/Linux 下: ctrl + d

                 while (  ( ch = getchar() ) != EOF ) 

                 这条语句在使用有符号集的机器上运行时,如果读取了一个值为\377的字节时,循环将终止,因为这个值截短再提升之后于EOF相等。   当运行在无符号字符集的机器上时,这个循环将永远不会终止!

    7. C中没有boolean类型,0为false, 非0均为true。

    8.中文输入法惹得祸

      编译提示:“程序中有游离的 \377”。 检查输入的字符,是否有中文输入法输入的。

  • 相关阅读:
    SJTU T4143 推箱子
    Markdown基本语法
    命令行的操作——cd
    C++ ------- 类和对象
    数据结构------栈和队列
    MySQL------ 子查询
    MySQL------ SQL99语法
    C++------内存分区模型
    第三章------数据链路层
    MySQL------ SQL92语法
  • 原文地址:https://www.cnblogs.com/hilnx/p/2781580.html
Copyright © 2020-2023  润新知