#define宏加括号和不加括号的区别
#define 宏是在代码中不加任何验证的直接替代,当宏中包含运算符时要在最外层加括号,不然可能会出错
下面使用一个简单的例子来验证一下,代码中定义一个求两个数中最大数的宏:
MAX_wrong在外层没有加括号,MAX_right在外层加了括号
#include<stdlib.h>
#include<stdio.h>#define MAX_wrong(x,y) x>y?x:y
#define MAX_right(x,y) (x>y?x:y)int main()
{int x, y;scanf("x=%d y=%d", &x, &y);//下面这行等价于 int a = x>y?x:y*6int a = MAX_wrong(x,y) * 6; //下面这行等价于 int a = (x>y?x:y)*6 int b = MAX_right(x,y) * 6;/*下面这行输出的两个结果是一样的*/printf("%d %d\n", MAX_wrong(x,y), MAX_right(x,y));/*当x>y时,a和b值不一样,当x<=y时,a和b的值一样*/printf("%d %d\n", a, b);return 0;
}
经过下面两个测试用例,发现不管定义宏时外层加没加括号,宏MAX_wrong和宏MAX_right的值都是一样的,没有问题。
但是要对宏进行运算时出现了问题,下面第一个的测试结果中,a和b的值碰巧一样;但是第二个测试结果中a和b的值不同,b是我们想要的值,a的值和预想中不一样。
分析其原因:
int a = MAX_wrong(x,y) * 6; 这句话实际相当于 int a = x>y?x:y* 6;
x>y?x:y* 6 的意思是如果x>y则返回x,否则返回冒号后面的值y*6
而int b = MAX_right(x,y) * 6; 这句话实际相当于 int a = (x>y?x:y) * 6;
括号的优先级要高于*,所以会先计算x>y?x:y的值,再进行*6,与我们想要的一样。
完毕!
#define宏加括号和不加括号的区别相关推荐
- Js函数加括号、不加括号
Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...
- js中方法调用加括号和不加括号的区别
前言 一个页面需要使用到setInterval和setTimeout.使用过程中对于方法的调用出现了加括号和不加括号的区别,当然在其他的场景也有发生,window.load = init等等 区别 以 ...
- Js事件绑定时,函数名加括号和不加括号有什么区别
Js事件绑定时,函数名加括号和不加括号有什么区别以window.onload为列 大致可以理解为一:不加括号时:=指向函数,触发事件时触发函数.window.οnlοad=aa;aa为一个函数等价于w ...
- js创建对象时,属性加引号与不加引号的区别(转)
概要: 总结一下: 1. 命名要规范,变量名或者属性名不能用数字开头. 2. 可以加引号后使用,但调用要像数组中的属性那样调用 obj['888name'] 3. 符合规范的时候,加不加引号一样 以 ...
- v-on:click(简写@click)绑定事件加括号和不加括号
如果事件绑定的方法没有参数可以选择加括号也可以不加括号
- js构造函数加括号与不加括号的区别
//首先定义一个构造函数Hello function Hello(){ alert(1): } //定义一个函数表达式 var getName = function(){ alert(2): } // ...
- java if 不加大括号_if条件后加大括号{}和不加大括号{}的区别
[前言] 本文简单说下if() 加大括号 和不加大括号有什么区别 简单点:有括号的话,if语句控制{}里面的所有语句,没括号的话,if语句只控制最近的一行.每句代码以分号 ; 分隔开来. [主体] 先 ...
- define宏定义和const定义之间的区别
define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...
- shell 数组遍历加引号和不加引号的区别?
前言 shell 是一个比较神奇的国度,里面有太多的坑需要填,今天需要填的坑就是,数组遍历在使用时加了引号和不加引号的区别. 案例 解析: 不加引号,数组中元素间的"空格"就会编程 ...
最新文章
- opencv中的push_back()函数
- dos系统 关闭服务器,如何开启或关闭服务程序?巧用DOS命令全攻略
- 将项目导入myeclipse后 tortoise svn 右键项目不能更新和提交
- networkX如何读取存储图的二进制.dat文件
- mockJs文档(一)
- Oracle中的Round和Trunc
- C#创建简单的验证码
- 技术竞争力之Web技术方向
- java高级工程师线程_java高级工程师--------多线程并发
- Facebook广告设定技巧经验分享
- 神奇的中医!神奇的文化!
- 电脑win7语音怎么测试软件,win7话筒怎么测试 win7话筒测试方法【图文】
- 支付宝集成——如何在回调地址中使用自定义参数
- 怎样制作动图gif?GIF生成器帮你一键制作gif
- 最大子段和三种算法实现
- 分享200个App移动端模板---总有一个适合你
- Docker - 常见操作命令篇
- Aspose.Words 删除批注
- (2)前端-初识HTML与CSS-table、form
- oracle-1480,1400,1438错误一些解决方式