| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 502 人关注过本帖
标题:今天的最后一个问题,不要误会我不是灌水.....
只看楼主 加入收藏
swiminfire
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2005-8-11
收藏
 问题点数:0 回复次数:8 
今天的最后一个问题,不要误会我不是灌水.....
1.
#define SQR(X) X*X
  main()
  { int a=16, k=2, m=1;
   a/=SQR(k+m)/SQR(k+m);
   printf(“d\n”,a);
  }

这个出来的只为什么是2,而不是0.a/=SQR(k+m)/SQR(k+m)是不是等价与a=a/SQR(k+m)/=SQR(k+m)?帮我分解下这个表达式谢谢.

2.
#define f(a, b, x) a*x+b
printf("%d, %dn", f(3,2,1), f(6, 5, f(3, 2, 1)));
第一个值是5没有异议,然后第二个值却是25就不能理解了,他里面调用后函数不就是f(6,5,5)了吗?这有是怎么会事哦??

3.
对于基类型相同的两个指针变量之间为什么不能进行'+'运算.指针不是可以做算术,*,&还有赋值运算的吗?

4.
int k=0
  while(k=1)k++;
  while 循环执行的次数是< >1.无限循环还是.2有语法错误?
我是觉得有语法错误,因为while(k=1)是赋值运算了。
搜索更多相关主题的帖子: 灌水 
2007-01-28 23:23
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
1. a/=SQR(k+m)/SQR(k+m); 展开后为:a /= k + m * k + m / k + m * k + m ,所以 a /= 2 + 1 * 2 + 1 / 2 + 1 * 2 + 1 = 7 ,所以 a = 16 / 7 = 2
2. f(6, 5, f(3, 2, 1)) 展开一次后为:6 * f(3, 2, 1) + 5 继续展开:6 * 3 * 1 + 2 + 5 ,所以结果为25
3. 两个指针相加没有任何语义,所以不被允许,但指针允许相减,是因为能获得两指针间的元素个数
4.
int k=0
  while(k=1)k++;
  while 循环执行的次数是< >1.无限循环还是.2有语法错误?
我是觉得有语法错误,因为while(k=1)是赋值运算了
没有语法错误,k=1赋值表达式的结果为k的值,即1,永远为真,所以将无限循环
所以有人建议这样写:while( 1 == k),这样的话,如果误把==写成=之后,编译器能够检查到错误。

2007-01-29 00:34
swiminfire
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2005-8-11
收藏
得分:0 
a/=SQR(k+m)/SQR(k+m) 还是不明白为什么这个表达式不是a/=SQR(k*k+m+m)/SQR(k*k+m+m).而会是a /= k + m * k + m / k + m * k + m 。但是a/=SQR(k+m)==a/=SQR(k*k+m+m)的。


然后第二题里面的那个不能在作直接调用来运算值了。

谢谢tyc611的解答!

Get in first, and then word your ways out ! BY KIKI
2007-01-29 08:28
huawang99
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2007-1-28
收藏
得分:0 

你把开头的那个 #define SQR(X) X*X
改为: #define SQR(X) (X*X)

再把a/=SQR(k+m)/SQR(k+m);
改为:a=a/SQR(k+m)/SQR(k+m);

就会得到你想要的结果了.


2007-01-29 12:30
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
#define SQR(X) X*X
SQR(2+1)
#define 只展开 不运算 把2+1==X 。X*X==2+1*2+1

羊肉串 葡萄干 哈密瓜!!
2007-01-29 12:46
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
以下是引用huawang99在2007-1-29 12:30:34的发言:

你把开头的那个 #define SQR(X) X*X
改为: #define SQR(X) (X*X)

再把a/=SQR(k+m)/SQR(k+m);
改为:a=a/SQR(k+m)/SQR(k+m);

就会得到你想要的结果了.

再改一下就好了:#define SQR(x) ((x)*(x))
不然,如有如下代码时就可能不是你所期望的行为了:SQR(a + b)


2007-01-30 01:06
tyc611
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2007-1-21
收藏
得分:0 
以下是引用swiminfire在2007-1-29 8:28:00的发言:
a/=SQR(k+m)/SQR(k+m) 还是不明白为什么这个表达式不是a/=SQR(k*k+m+m)/SQR(k*k+m+m).而会是a /= k + m * k + m / k + m * k + m 。但是a/=SQR(k+m)==a/=SQR(k*k+m+m)的。


然后第二题里面的那个不能在作直接调用来运算值了。

谢谢tyc611的解答!

宏替换完全可以手动模拟,我二楼已经给你模拟替换了一遍,你再好想想

另外,你要明白“a/=SQR(k+m)==a/=SQR(k*k+m+m)”里==和/=的优先级关系,


2007-01-30 01:14
swiminfire
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2005-8-11
收藏
得分:0 

明白,明白 ,谢谢谢谢各位大侠


Get in first, and then word your ways out ! BY KIKI
2007-02-05 10:58
陈翠
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2007-2-5
收藏
得分:0 
第一题我算出来怎么是16?

2007-02-05 21:21
快速回复:今天的最后一个问题,不要误会我不是灌水.....
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023365 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved