宏只是把所有参数连接起来,拼成一个表达式而已
你这里直接把x和y代入进去就知道问题在哪里了
原来的表达式为:a + b a - b
改了之后为:(a + b) (a - b)
所以你如果用宏的话,最好这样写:#define M(x, y) (x) (y)
这样就不会出现这种错误了
优先级高到低:
第一级:圆括号()、下标运算符[]、分量运算符的指向结构体成员运算符->、结构体成员运算符。
第二级:逻辑非运算符!、按位取反运算符~、自增自减运算符++ --、负号运算符-、类型转换运算符(类型)、指针运算符和取地址运算符和&、长度运算符sizeof。
第三级:乘法运算符、除法运算符/、取余运算符%。
第四级:加法运算符+、减法运算符-。
第五级:左移动运算符<<、右移动运算符>>。
第六级:关系运算符< > <= >= 。
第七级:等于运算符==、不等于运算符!=。
第八级:按位与运算符&。
第九级:按位异或运算符^。
第十级:按位或运算符|。
第十一级:逻辑与运算符&&。
第十二级:逻辑或运算符||。
第十三级:条件运算符:。
第十四级:赋值运算符= += -= = /= %= >>= <<= &= |= ^=。
第十五级:逗号运算符,。
扩展资料
优先级与求值顺序无关。如(a+b)&&(bc),虽然优先级最高,但这个表达式求值顺序是从左到右。优先级从上到下依次递减,最上面具有最高的优先级,逗号 *** 作符具有最低的优先级。
相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
基本的优先级需要记住:指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。1<<3+2&7等价于 (1<<(3+2))&7。逻辑运算最后结合。
-运算符
-运算符优先级
寻找一个参数完全匹配的函数,如有,则调用它
如果失败,寻找一个函数模板,使其实例化,产生一个匹配的模板函数,若有,则调用它
如果失败,再试低一级的对函数重载的方法,例如通过类型转换可产生的参数匹配等,若找到匹配的函数,调用它
如果失败,则证明这是一个错误的调用。
也就是说,
1完全匹配的函数;
2摸板函数;
3重载函数;
4没有匹配的调用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)