鱼C论坛

 找回密码
 立即注册
查看: 1590|回复: 1

[已解决]想问一下为什么输出的是11

[复制链接]
发表于 2023-3-18 16:38:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#define ADD(x,y) x+y
int main()
{
        int k;
        k=ADD(1,2)*ADD(3,4);
        printf("%d\n",k);       
        return 0;
}
想问一下这个为什么输出是11呀
最佳答案
2023-3-18 16:41:17
这个 C 程序的输出是 11,因为在 C 语言的宏替换过程中,没有考虑到运算符的优先级。这里我们分解一下代码来解释这个现象。

首先,定义了一个宏 ADD(x, y),用于计算 x 和 y 的和。在代码的 main 函数中,用这个宏计算了 k 的值:
k = ADD(1, 2) * ADD(3, 4);

宏的替换是在预处理阶段完成的,因此在编译时,上述代码会被替换为:
k = 1 + 2 * 3 + 4;

注意,这里的替换是纯文本替换,没有考虑运算符的优先级。在 C 语言中,乘法运算符 (*) 的优先级高于加法运算符 (+)。因此,这个表达式会按照如下顺序计算:
k = 1 + (2 * 3) + 4;

计算后得到:
k = 1 + 6 + 4;

最后:
k = 11;

所以程序的输出是 11。

为了避免这种问题,可以在宏定义中使用括号来确保正确的计算顺序:
#define ADD(x, y) ((x) + (y))

这样修改后,程序会输出正确的结果,即 21。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-18 16:41:17 | 显示全部楼层    本楼为最佳答案   
这个 C 程序的输出是 11,因为在 C 语言的宏替换过程中,没有考虑到运算符的优先级。这里我们分解一下代码来解释这个现象。

首先,定义了一个宏 ADD(x, y),用于计算 x 和 y 的和。在代码的 main 函数中,用这个宏计算了 k 的值:
k = ADD(1, 2) * ADD(3, 4);

宏的替换是在预处理阶段完成的,因此在编译时,上述代码会被替换为:
k = 1 + 2 * 3 + 4;

注意,这里的替换是纯文本替换,没有考虑运算符的优先级。在 C 语言中,乘法运算符 (*) 的优先级高于加法运算符 (+)。因此,这个表达式会按照如下顺序计算:
k = 1 + (2 * 3) + 4;

计算后得到:
k = 1 + 6 + 4;

最后:
k = 11;

所以程序的输出是 11。

为了避免这种问题,可以在宏定义中使用括号来确保正确的计算顺序:
#define ADD(x, y) ((x) + (y))

这样修改后,程序会输出正确的结果,即 21。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表