`

《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();

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics