
#define SQR(X)X*X Main(){ int a=10,b=5, c=3; a/= SQR(b+c)/SQR(b+c); print f(“%d\n”,a); }
展开全部
这个问题可以这样来分析:
a/= SQR(b+c)/SQR(b+c) 通过宏展开等于是
a=a/(b+c*b+c/b+c*b+c) 代值以后等于是
a=10/(5+3*5+3/5+3*5+3)
=10/(5+15+0+15+3)
=10/38
=0
因此 最终的输出是0
这有2点值得注意:
1) 宏展开 #define SQR(X) X*X和#define SQR(X) (X*X)是非常不同的 区别就在有括号没有
由于你的定义没括号 所以展开之后的运算优先级如上面所写 而不是一般初学者认为的
a=a/((b+c)*(b+c)/(b+c)*(b+c))
2) 在上面的运算中3/5和10/38都都等于0 这和我们一般的认识不同
原因在于变量a,b,c都是整型的 而整型的除法结果还是整型 所以结果是截位取整
比如3/5=0.6 但小数部分自动不要了 结果就是0 10/38也是一样的
a/= SQR(b+c)/SQR(b+c) 通过宏展开等于是
a=a/(b+c*b+c/b+c*b+c) 代值以后等于是
a=10/(5+3*5+3/5+3*5+3)
=10/(5+15+0+15+3)
=10/38
=0
因此 最终的输出是0
这有2点值得注意:
1) 宏展开 #define SQR(X) X*X和#define SQR(X) (X*X)是非常不同的 区别就在有括号没有
由于你的定义没括号 所以展开之后的运算优先级如上面所写 而不是一般初学者认为的
a=a/((b+c)*(b+c)/(b+c)*(b+c))
2) 在上面的运算中3/5和10/38都都等于0 这和我们一般的认识不同
原因在于变量a,b,c都是整型的 而整型的除法结果还是整型 所以结果是截位取整
比如3/5=0.6 但小数部分自动不要了 结果就是0 10/38也是一样的
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询