c语言中宏的副作用,C语言中宏、逻辑、数组等陷阱语句注意!(二级必看)

在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不在执行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值