#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宏加括号和不加括号的区别相关推荐

  1. Js函数加括号、不加括号

    Js函数加括号.不加括号 (function a(){}) (命名函数表达式)会返回这个函数(不会执行),但是在括号外面无法调用该函数,需要一个变量接收这个函数,var fun = (function ...

  2. js中方法调用加括号和不加括号的区别

    前言 一个页面需要使用到setInterval和setTimeout.使用过程中对于方法的调用出现了加括号和不加括号的区别,当然在其他的场景也有发生,window.load = init等等 区别 以 ...

  3. Js事件绑定时,函数名加括号和不加括号有什么区别

    Js事件绑定时,函数名加括号和不加括号有什么区别以window.onload为列 大致可以理解为一:不加括号时:=指向函数,触发事件时触发函数.window.οnlοad=aa;aa为一个函数等价于w ...

  4. js创建对象时,属性加引号与不加引号的区别(转)

    概要: 总结一下: 1. 命名要规范,变量名或者属性名不能用数字开头. 2. 可以加引号后使用,但调用要像数组中的属性那样调用  obj['888name'] 3. 符合规范的时候,加不加引号一样 以 ...

  5. v-on:click(简写@click)绑定事件加括号和不加括号

    如果事件绑定的方法没有参数可以选择加括号也可以不加括号

  6. js构造函数加括号与不加括号的区别

    //首先定义一个构造函数Hello function Hello(){ alert(1): } //定义一个函数表达式 var getName = function(){ alert(2): } // ...

  7. java if 不加大括号_if条件后加大括号{}和不加大括号{}的区别

    [前言] 本文简单说下if() 加大括号 和不加大括号有什么区别 简单点:有括号的话,if语句控制{}里面的所有语句,没括号的话,if语句只控制最近的一行.每句代码以分号 ; 分隔开来. [主体] 先 ...

  8. define宏定义和const定义之间的区别

    define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...

  9. shell 数组遍历加引号和不加引号的区别?

    前言 shell 是一个比较神奇的国度,里面有太多的坑需要填,今天需要填的坑就是,数组遍历在使用时加了引号和不加引号的区别. 案例 解析: 不加引号,数组中元素间的"空格"就会编程 ...

最新文章

  1. opencv中的push_back()函数
  2. dos系统 关闭服务器,如何开启或关闭服务程序?巧用DOS命令全攻略
  3. 将项目导入myeclipse后 tortoise svn 右键项目不能更新和提交
  4. networkX如何读取存储图的二进制.dat文件
  5. mockJs文档(一)
  6. Oracle中的Round和Trunc
  7. C#创建简单的验证码
  8. 技术竞争力之Web技术方向
  9. java高级工程师线程_java高级工程师--------多线程并发
  10. Facebook广告设定技巧经验分享
  11. 神奇的中医!神奇的文化!
  12. 电脑win7语音怎么测试软件,win7话筒怎么测试 win7话筒测试方法【图文】
  13. 支付宝集成——如何在回调地址中使用自定义参数
  14. 怎样制作动图gif?GIF生成器帮你一键制作gif
  15. 最大子段和三种算法实现
  16. 分享200个App移动端模板---总有一个适合你
  17. Docker - 常见操作命令篇
  18. Aspose.Words 删除批注
  19. (2)前端-初识HTML与CSS-table、form
  20. oracle-1480,1400,1438错误一些解决方式

热门文章

  1. VUE 中的搜索关键字
  2. javascript_outline
  3. android源码大全 IOS游戏源代码打包下载 小游戏|视频教程 微信小程序源码带后台全套|公众号平台
  4. 干货满满!25种绝佳VSCode扩展,体验便捷高效的生活
  5. java对象的内存布局
  6. 程序员面试,面试官更注重代码量、项目经验还是操作系统、数据结构这种基础课程?...
  7. 【人工智能项目】Fashion Mnist识别实验
  8. 《白鹿原》电视剧观后感
  9. 赵小楼《天道》《遥远的救世主》深度解析(126)说老实话办老实事,实事求是
  10. STM32移植STemwin