#define的笔试问题
之前,在笔试的时候,经常会看到这样的题:
#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;这个语句,因为这个语句有分号,所以没有错误,能运行