我试图定义一个返回数字绝对值的宏。这是它的样子:
#define ABSOLUTE_VALUE(v) ( (v) < 0 ? (v) *= -1 : (v))
当我只插入一个数字时,它工作正常。问题是,当我尝试插入表达式(例如number + anotherNumber
)时,编译器会抛出一个错误,说表达式不可分配。我无法弄清楚它为什么这样做。如果您知道错误的原因,我将非常感谢您的帮助。
答案 0 :(得分:3)
这里发生的事情是,整个表达式number + anotherNumber
已传递到您的宏,因此在v
的任何地方,它都不是结果{{1}而且,v = number + anotherNumber
在评估之前被v
替换。所以:
number + anotherNumber
变为
(v) *= -1
由于(number + anotherNumber) *= -1
是另一个数字,代码的这一部分正在尝试将number + anotherNumber
的值分配给-1 * (number + anotherNumber)
,这会导致您看到的错误,因为您可以& #39; t为表达式分配内容。
答案 1 :(得分:2)
您的一条评论:
问题是我正在尝试将(number + anotherNumber)*( - 1)的结果分配给表达式,即number + anotherNumber。但是,在* =运算符之前,不应该首先开火+
您误解作业。赋值的左侧(LHS)必须是左值,这意味着类似变量,它引用可以存储值的存储位置。
值就是这样,它不与任何存储位置相关联,您无法分配给它。表达式number + anotherNumber
的结果是一个数字,它不能用于作业的LHS。
如果您只是将=*
替换为*
,那么您的宏就可以使用。
HTH