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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值