#define的笔试问题

2025年11月29日 面试/笔试

之前,在笔试的时候,经常会看到这样的题:

#define ADD(x,y) x+y

然后给一串代码,例如:

int main()
{
    int i = 1;
    int b = 2;
    int c = 3*ADD(i,b)*5; 
}

然后问c的值是多少

当时我只知道define比较像简单的文本替换,就是将看到define左边的内容会自动替换成右边的内容,却不知道它也像函数一样支持参数····

所以,看到这道题的时候,我就会很蒙····x···y在哪呢?

其实如同上面的例子一样,i和b就已经像参数一样,代表了x和y了

所以ADD(i,b)就被替换成了i+b

但是问题来了,define做的只是内容替换,替换之后会成为

int c = 3 * i + n * 5;

按照优先级就得先算3*i,再算n*5最后再相加得出结果·····

然后我又做了一下测试,查看define是否真的是内容替换:

#include <iostream>
#include <algorithm>
#define ADD(x,y) cout<<x<<" "<<y<<endl;

using namespace std;

int main()
{
    int i = 1;
    int b = 2;
    ADD(i,b)
}

结果打印出了1和2

可以看出ADD(x,y)的内容是输出x和y的值的语句

我在main函数中ADD(i,b)甚至都没有分号,如果不是内容替换的话,没有分号会出错的。但是因为是内容替换所以当看到ADD(i,b)的时候直接就转化成了cout<<i<<” “<<b<<endl;这个语句,因为这个语句有分号,所以没有错误,能运行

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注