以下哪两个电话肯定有​​效,为什么?

时间:2013-11-23 02:36:48

标签: c

MAC(++a, b); 

mac(++a, b);

第一个是宏调用,第二个是类似的函数调用。

这是C编程书中一章末尾的复习问题。我不认为其中任何一个都是有效的,也许这是一个技巧问题,但我不确定,因为我没有真正看到宏调用与这个实例中的函数调用有什么不同

1 个答案:

答案 0 :(得分:3)

保证有效版本可能是

mac(++a, b)

因为宏版本MAC可能会多次评估其操作数。举个例子

#define MAC(a, b) (a + a + b)

在这种情况下,MAC(++a, b)将扩展为

(++a + ++a + b)

未定义,因为它在两个序列点之间修改了两次a

另一方面,函数调用始终只计算一次其参数。