首页
社区
课程
招聘
请指点C程序题
发表于: 2005-1-11 16:25 3950

请指点C程序题

2005-1-11 16:25
3950
本人的逻辑思维很差,还请指点下面的C程序题?

有以下程序

#define  f(x)    x*x /*这里是定义宏呀*/

main( )

{  int i;

    i=f(4+4)/f(2+2); /*这行真不好理解,宏扩展真难理解*/

    printf("%d\n",i);

}  

执行后输出结果是(28)

不解,请拆解指教i 的运算过程

有以下程序

int a=2;

int f(int *a)

{return (*a)++;}

main( )

{  int s=0;

     { int a=5; /*这里不是给定了新值,下面第一行的s+=f(&a)怎么好像没有用吗?*/

       s+=f(&a);

     }

    s+=f(&a);

    printf("%d\n",s);

}  

执行后输出结果是(7)

不解,请拆解指教s 的运算过程

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
2
1、宏定义是原样展开的。
4+4*4+4/2+2*2+2=28

2、注意变量作用域

5+2=7

里面的那个变量到第2个f时已经废了。
2005-1-11 16:34
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
3
经典考题。
2005-1-11 20:04
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
4
第一个关键要理解宏仅仅是文本替换
#define  f(x)    x*x 只是表示在遇到f时把宏参数文本替换一下,是编译以前做的处理

第二个{}表示变量作用域,{ int a=5;算是这个{}里的局部变量
这种声明在for(int i=0;;)或者case x:{}这样的结构里用很方便
2005-1-11 21:29
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
5
thanks:D
2005-1-12 09:21
0
雪    币: 387
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
大学里面学的C现在都快忘光了,长见识了:D
2005-1-12 10:02
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
7
今天C++期末考试考了第一个宏展开,结果结果居然做错了...shit...对着纸张没有感觉
2005-1-18 19:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
1:简单(运算符优先)先乘后除然后加起来就那结果

2:搞清全局变量跟局部变量的关系+运复符优先的关系
  第一次调用f()用的是局部变量 返回 5 S=5
  第二次调用f()用的是全局变量 返回 2 S=5+2
2005-1-18 20:16
0
雪    币: 519
活跃值: (1223)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
9
最初由 DonQuixote 发布
今天C++期末考试考了第一个宏展开,结果结果居然做错了...shit...对着纸张没有感觉


真幸福
2005-1-19 09:44
0
游客
登录 | 注册 方可回帖
返回
//