宏在 C 中表现不同并给出不同的输出

Macros behaving differently in C and gives different output

我是 c 的新手。这里定义了一个宏为#define val 4+2。当尝试使用 val*val 打印正方形时,它给出的输出为 14 而不是 36。这是怎么发生的,但是当宏定义为 #define val 6 时,它会给出正确的输出。这是示例代码片段。有人可以解释为什么会这样吗?

#define max 4+2

int main()
{
   printf("%d\n",max);    
   int i = max*max;
   printf("%d\n",i);
}

输出: 6个 14

声明

int i = max*max;

扩展到

int i = 4 + 2 * 4 + 2;

相当于

int i = 4 + (2 * 4) + 2;

如果你希望结果是

int i = (4 + 2) * (4 + 2);

那么您需要在宏中显式添加括号:

#define max (4+2)

这是宏的一个常见“缺陷”,也是不鼓励使用宏或仅用于非常简单的常量值的原因之一。

宏是“愚蠢的”文本替换,没有语义理解。如果将“max”替换为“4+2”(这是预处理器所做的),您将看到 i 的初始化解析为:

int i = 4+2*4+2;

从这里更容易看出结果是4+2*4+2=4+8+2=14。

如果你想max代表6“困难的方式”,你可以用括号括起来:

#define max (4+2)

这样,预处理器将解决:

int i = (4+2)*(4+2);

您将得到预期的 i=36。

在 运行 您的代码通过预处理器后 (gcc -E)

//removing the content from stdio.h for brevity...

int main()
{
   printf("%d\n",4+2);   // output : 6, as expected
   int i = 4+2*4+2;      // note the expansion here, not what you'd expect!
   printf("%d\n",i);     // value of 'i' is not what you'd expect!
}

所以,要详细说明

 int i = 4+2*4+2;

实际上与

相同
int i = (4) + (2*4) + (2) ;

产生14的输出,而不是36,至于没有括号强制运算符优先级,默认优先级在起作用,如上所示执行。

建议:始终将宏括在括号中以避免这种情况。