简单理解#define SQR(X) X*X ,就是告诉编译器在代码中只要遇到SQR(X)的格式就用X*X替换。比如SQR(k+m)就相当于 (k+m)*(k+m)。
定义宏的好处是,方便后期修改,多处引用,只要修改开头定义就行。
函数式宏(function-like macro)较之对象式宏可以进行更复杂的代换。
函数式宏 sqr 是在编译时展开并填入程序的,因此 只要是能用双目运算符 * 进行乘法计算的数据类型,都能使用函数式宏 。
函数定义则需为每个形参都定义各自的数据类型,返回值的类型也只能为一种。就这点而言,函数较为严格。
函数为我们默默无闻地进行了一些复杂处理,如:
而函数式宏所做的工作只是宏展开和填入程序,并不进行上述处理。
根据以上特征, 函数式宏或许能使程序的运行速度稍微提高一点,但是程序自身却有可能变得臃肿 。
函数式宏在使用上必须小心谨慎。例如, sqr(a++) 展开后 ((a++) * (a++)) 。每次展开, a 的值都会自增两次。在不经意间表达式被执行了两次,导致程序出现预料之外的结果,我们称这种情况为宏的 副作用(side effect) 。
40把SQR带入即可。
a/=k+m*k+m/k+m*k+m
=2+1*2+1/2+1*2+1
=2+2+0+2+1
=7
a=a/7=10/7=1
选B
41
main中for循环有错,应该是i++
于是
for循环执行2次
第一次:
k=f(a++)
先取值,即k=f(2)
a再自加为3.
进入f函数。
b=0
c=3
a=c++
=3
c自加为4
b++
自加为1.
返回a即3.
第二次进入f
执行f(3)
b=0
c=4
注意c是静态的,值是上次退出的值。
a=c++
=
4
c=5
b=1
返回4
于是k=4
选D