宏在 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
,至于没有括号强制运算符优先级,默认优先级在起作用,如上所示执行。
建议:始终将宏括在括号中以避免这种情况。
我是 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
,至于没有括号强制运算符优先级,默认优先级在起作用,如上所示执行。
建议:始终将宏括在括号中以避免这种情况。