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”。 检查输入的字符,是否有中文输入法输入的。