<分区>
MAC(++a, b);
或
mac(++a, b);
第一个是宏调用,第二个是类似的函数调用。
这是 C 编程书籍中一章末尾的复习题。我认为两者都不确定是有效的,也许这是一个棘手的问题,但我不确定,因为我真的看不出宏调用与此实例中的函数调用有何不同
标签 c
<分区>
MAC(++a, b);
或
mac(++a, b);
第一个是宏调用,第二个是类似的函数调用。
这是 C 编程书籍中一章末尾的复习题。我认为两者都不确定是有效的,也许这是一个棘手的问题,但我不确定,因为我真的看不出宏调用与此实例中的函数调用有何不同
最佳答案
保证有效的版本可能是
mac(++a, b)
因为宏版本 MAC
可能会多次计算其操作数。举个例子
#define MAC(a, b) (a + a + b)
在这种情况下,MAC(++a, b)
将扩展为
(++a + ++a + b)
这是未定义的,因为它在两个序列点之间修改了两次 a
。
另一方面,函数调用只会对其参数求值一次,并且始终如此。
关于c - 以下两个调用中哪一个肯定是有效的,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20157833/