未知类型的 C 预处理器宏
Unknown type of C preprocessor macro
谁能解释一下下面的 C 预处理器宏是如何工作的:
#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
源代码然后像这样使用它:
y = SQR(a - b);
这是否与以下相同,如果是,为什么?
#define SQR(a) ((a)*(a))
提前致谢!
展开后
y = (sqrarg=(a-b), sqrarg*sqrarg);
,
是一个逗号运算符,因此首先 sqrarg=(a-b)
将被评估,并且 a-b
将被分配给 sqrarg
,表达式 sqrarg=(a-b)
的值将被丢弃。之后 sqrarg*sqrarg
将被评估并将结果分配给 y
。
Is this therefore the same as the following and if so why?
#define SQR(a) ((a)*(a))
是的。除了后者, a
将被评估两次。
我认为你问题中 SQR
的第一种形式背后的想法是,如果 SQR()
的参数是一个函数,它只会被评估一次。也就是说,如果您有:
#define SQR(a) ((a)*(a))
你的代码中有:
myval = SQR(myfunction())
这将计算为:
myval = (myfunction() * myfunction())
而如果您有:
#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
计算结果为:
myval = (sqrarg=(myfunction()), sqrarg*sqrarg)
只调用 myfunction()
一次。如果 myfunction()
是计算密集型的,这刚刚为您节省了大量时间。
谁能解释一下下面的 C 预处理器宏是如何工作的:
#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
源代码然后像这样使用它:
y = SQR(a - b);
这是否与以下相同,如果是,为什么?
#define SQR(a) ((a)*(a))
提前致谢!
展开后
y = (sqrarg=(a-b), sqrarg*sqrarg);
,
是一个逗号运算符,因此首先 sqrarg=(a-b)
将被评估,并且 a-b
将被分配给 sqrarg
,表达式 sqrarg=(a-b)
的值将被丢弃。之后 sqrarg*sqrarg
将被评估并将结果分配给 y
。
Is this therefore the same as the following and if so why?
#define SQR(a) ((a)*(a))
是的。除了后者, a
将被评估两次。
我认为你问题中 SQR
的第一种形式背后的想法是,如果 SQR()
的参数是一个函数,它只会被评估一次。也就是说,如果您有:
#define SQR(a) ((a)*(a))
你的代码中有:
myval = SQR(myfunction())
这将计算为:
myval = (myfunction() * myfunction())
而如果您有:
#define SQR(a) (sqrarg=(a),sqrarg*sqrarg)
计算结果为:
myval = (sqrarg=(myfunction()), sqrarg*sqrarg)
只调用 myfunction()
一次。如果 myfunction()
是计算密集型的,这刚刚为您节省了大量时间。