首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《C圈套与缺陷》

2012-09-10 
《C陷阱与缺陷》#C语言的基本数据类型直接与底层的硬件相对应。?#宏最好只用于命名常量,并为一些适当的结构提

《C陷阱与缺陷》

#C语言的基本数据类型直接与底层的硬件相对应。

?

#宏最好只用于命名常量,并为一些适当的结构提供简捷的记法。

?

#千万不要使用C预处理器来修改语言的基础结构。

?

#一个严格的可移植的程序应该是:

? 1 只使用已确定的特性

? 2 不突破任何由编译器实现的限制

? 3 不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。

?

#程序的可移植性是非常重要的,所以在你的现实编码中,应该始终哟啊保证加上必要的类型转换,返回值等。

?下面的程序并不是严格遵循标准的,因为输出结果由编译器定义的:

#include <stdio.h>
#include <limits.h>

int main()
{
? (void)printf("the biggest int is %d",INT_MAX);
? getchar();
? return 0;
}

?

#关于运算符优先级问题,最好是加上括号,不确定的时候进行查找确认。

我们需要记住重要的几点:

1 任何一个逻辑运算符的优先级 < 任何一个关系运算符

2 关系运算符<移位运算符<算术运算符

?

# C语言中只有一维数组,而且数组的大小必须在编译期间就作为常数确定下来。

?

#库函数strlen返回参数中字符串所包括的字符数目,而作为结束标志的空字符并为计算在内。

?

#如果我们使用数组名作为参数,那么数组名会立刻被转换为指向该数组第1个元素的指针。因此数组作为函数参数毫无意义。所以,C语言会自动地将作为参数的数组声明转换为响应的指针声明。

?

#在无符号算术运算中,没有所谓的“溢出”一说;如果算术运算符的一个操作数是有符号,一个是无符号,那么有符号整数会被转化成无符号整数,溢出也不可能发生。

?? 假定a和b是两个非负整形变量,我们需要检查a+b是否会溢出,一种想当然的办法是

if(a + b < 0)

?complain();

这并不能运行,当a+b确实溢出时,所有关于结果如何的假设都不再可靠。

?

实现办法:

if((unsigned)a + ((unsigned)b?> INT_MAX)

?complain();

热点排行