在C语言中使用宏是为了方便对一个表达式重复的引用,因而使用宏实质上是用定义的宏表达式替代代码中的语句!特别说明:是替代!!
如:
#define f(x) x*x+2
……
int t=3;
f(3)*f(2);很多人初学者认为答案等于66(11*6);错!!!!解析如下:
宏是替代,不是运算,所以该语句用宏替换为:3*3+2*2*2+2,等于19
……
陷阱语句:
例子:
int a=6;
a+=a-=6*6;
该表达式很多粗心的学者,认为答案为:-24(6*6=36,6-36=-30;-30+6=-24);错!!
因为执行a-=时,a的值已经变化了,故前面a+=时,a的值应为-30;所以答案为:-60(6*6=36,6-36=-30;-30+(-30)=-60)
逻辑运算陷阱:
……
int a=0,b=0,c=1;
if(++a>0||++b>0)
c++; 执行后a=1,b=0,c=2;因为或运算,只要判断一个成立就不会进行下一个的判断,所以 ++a>0成立时,++b就不会执行,注意!
……
数组注意:
定义数组时如a[N],N必须是常量表达式,下面定义式错误的:
int N;
scanf("%d",&N);
a[N];错误!因为N为变量,尽管后面通过输入时赋值了,但在预编译时,还是变量,因而绝对通不过编译!
定义多维数组,可以通过指针定义。
如:
char *a[]={"asdasd","wfefefe","jhjhjh"};
其表示的是数组中得元素都为指针!即指针数组
逗号表达式:
(a=2*3,a*2);
求a+6的值。其值为12,因为a=2*3=6,后面的a*2并没赋值,只是陷阱
静态变量:
静态变量初始化后,就不会再次进行初始化,其生存期为整个程序,对于未初始化的变量,系统自动赋值为0,非静态变量不具备。
例子:
……
void fun()
{
static int c=2;//只初始化一次!!!!
printf("%d ",c);
c++;
}
main()
{
for(int i=0;i<4;i++)
fun();
}
……
该程序的输出结果为2,3,4,5;因为初始化后,不管后面调用几次,它都不会再次初始化(即c=2不在执行)