c - Problems with #define in c
问题描述
#include <stdio.h>
#define M(x) x - x
int main () {
printf ("%d %d\n",M(M (1+2)) , M(M (3)));
return 0;
}
Can someone explain to me step by step how the result to this is 6 -6
?
解决方案
为了理解正在发生的事情,必须清楚的是,当宏被解析时,它只是一个替换,而不是一个计算。
例如
M(1+2)
被替换为
1 + 2 - 1 + 2
^ ^ ^
x - x
重要的是要观察到减号不适用于完整的表达式。所以在这种情况下,结果将是4
。
让我们分析一下我们组合的宏:
/* First step */
M(M(1+2) M(M(3))
M(1 + 2 - 1 + 2) M(3 - 3)
^ ^ ^ ^ ^ ^
x - x x - x
/* Second step */
M(1 + 2 - 1 + 2) M(3 - 3)
1 + 2 - 1 + 2 - 1 + 2 - 1 + 2 3 - 3 - 3 - 3
^ ^ ^ ^ ^ ^
x - x x - x
这些奇怪的和被传递给最终简化它们的编译器。结果实际上是6
(左侧)和-6
(右侧)。
我猜这个结果让您感到困惑,因为使用 definex-x
时,您希望 x 的每个值都得到 0。正如我向您展示的那样,您没有得到它的原因是减号仅适用于第一个加数。为了获得“始终为零的宏”,只需使用括号:
#define M(x) (x)-(x)
推荐阅读
- git - Vim 在作为子进程调用时忘记了如何使用左箭头键。怎么修?
- python - 通过需要文件的 CGI 表单字段将文本传递给 python
- google-app-engine - 无法使用应用引擎 SDK 在 App Engine 上部署
- macros - 有条件地选择 SAS 数据步骤中的数据集
- javascript - 在滚动时交换图像
- html - 仅使用 CSS 避免多个粘性 div 相互重叠(无 javascript)
- c# - UseHsts 不适用于 NetCore 2.1 网站
- node.js - 为什么我可以在 MongoDB 中更新一个字段而不能更新另一个字段?(平均堆栈)
- c# - 将模式窗口中的内容保存为 SQL Server 表中的 varbinary
- tensorflow - cudnnLSTM 不会恢复为 cudnnCompatibleLSTM