今天的最后一个问题,不要误会我不是灌水.....
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)是赋值运算了。
搜索更多相关的解决方案:
灌水
----------------解决方案--------------------------------------------------------
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(k=1)k++;
while 循环执行的次数是< >1.无限循环还是.2有语法错误?
我是觉得有语法错误,因为while(k=1)是赋值运算了。
所以有人建议这样写:while( 1 == k),这样的话,如果误把==写成=之后,编译器能够检查到错误。
----------------解决方案--------------------------------------------------------
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的解答!
----------------解决方案--------------------------------------------------------
你把开头的那个 #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(2+1)
#define 只展开 不运算 把2+1==X 。X*X==2+1*2+1
----------------解决方案--------------------------------------------------------
以下是引用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)
----------------解决方案--------------------------------------------------------
以下是引用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)/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)”里==和/=的优先级关系,
----------------解决方案--------------------------------------------------------
明白,明白 ,谢谢谢谢各位大侠
----------------解决方案--------------------------------------------------------
第一题我算出来怎么是16?
----------------解决方案--------------------------------------------------------