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