请帮我解释一下这个宏定义函数 \(^o^)/~#include < iostream >using namespace std;#define p(s) s/s // 就是这里void main(){\x09cout
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/16 18:25:16
请帮我解释一下这个宏定义函数 \(^o^)/~#include < iostream >using namespace std;#define p(s) s/s // 就是这里void main(){\x09cout
请帮我解释一下这个宏定义函数 \(^o^)/~
#include < iostream >
using namespace std;
#define p(s) s/s // 就是这里
void main()
{\x09cout
请帮我解释一下这个宏定义函数 \(^o^)/~#include < iostream >using namespace std;#define p(s) s/s // 就是这里void main(){\x09cout
这里将s直接代入即可,由于s可以是表达式,
而#define p(s) s/s 的本意应该是实现s和s的除法,即除法 / 作为最低优先级
实际上,当s为表达式时,除法可能不是最低优先级
就如本例
p(3*2) = 3*2/3*2 = 3*(2/3*2) = 3*4/3 = 4 // C/C++按由右至左计算顺序
这个例子两种意图:
1、告诉学习者,define的作用是完全替换,如这里的s,不做其他任何编译和运行,如果需要达成原本的意图,应该写成define p(s) (s)/(s); 同时告诉大家define语句与函数的区别,函数会将表达式计算出值再进行传递(传递值或引用,但不会传递表达式);
2、有意设计这样的语句,实现某些技巧性的运算,即不符合人们阅读意图但符合c/c++规则的语句——不推荐一般程序员使用,容易造成阅读混乱.
p(s)
这个是宏名,后面紧挨着的是宏代表的式子
表示带参数的宏定义,那,在程序中系统遇到p(s),就直接替换为s/s,然后在进行运算,3*2/3*2,输出结果为4,因为运算符*和/的优先级是相同的,则从表达式3*2/3*2的左往右运算得(6/3)*2,同理可得2*2,,所以结果为4