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/

相关文章:

c - 斐波那契数列在 C 中计数第 50 个数时出现段错误

在C中创建一个动态可扩展的内存数组

c - C 中的 IN 运算符

c - 由于未知原因传递给函数时,数组大小正在减小

c - 为什么 malloc 在我的 C 程序中不起作用?

将字符串数组中的每个单词大写

c - 为什么 stdio.h 打印写入使用文件描述符打开的文件?

C: clock() 在 Windows 和其他操作系统中的不同实现?

c - 什么是函数指示符和实际调用?

c - C 中的早期欧拉问题问题 - 为什么我得到输出 "nan"?