精华内容
下载资源
问答
  • 宏定义表达式—完备括号问题

    千次阅读 2016-06-28 15:38:37
    *#define RECTANGLE_AREA(a, b) (a) (b);则RECTANGLE_AREA(c + d, e + f)将扩展成: (c + d * e + f), d与e 先运算,造成错误** //...(1)上面的解释,应该是对应以下宏定义而言: #define RECTANGLE_AREA(a, b) (a

    *#define RECTANGLE_AREA(a, b) (a) (b);

    则RECTANGLE_AREA(c + d, e + f)将扩展成: (c + d * e + f), d与e 先运算,造成错误**

            //FROM:华为C语言编程规范
    

    这个解释有问题吧?

    个人理解:
    (1)上面的解释,应该是对应以下宏定义而言:
    #define RECTANGLE_AREA(a, b) (a *b)

    (2) (a) *(b) 问题在下面的解释:
    若g/RECTANGLE_AREA(c+d, e+f) ,将扩展成g/(c+d) *(e+f) , g与(e+f) 本应该是除法运算,结果变成了乘法运算,造成错误。

    欢迎拍砖指正,谢谢!

    展开全文
  • C语言宏定义

    2019-06-24 09:25:09
    @C语言宏定义 有如下一段代码: #define ADD(x,y) x+y int m=3; m+=m*ADD(m,m); 最后m的值为()? A 15 B 18 C 21 D 58 答案是A 解释:C语言中的宏定义#define ADD(a,b) a+b 只是定义了一个操作,并不能当成函数来...

    @C语言宏定义

    有如下一段代码:

    #define ADD(x,y) x+y
    int m=3;
    m+=m*ADD(m,m);
    

    最后m的值为()?

    A 15 B 18 C 21 D 58

    答案是A
    解释:C语言中的宏定义#define ADD(a,b) a+b 只是定义了一个操作,并不能当成函数来用,用时直接把ADD(a,b) 部分替换成a+b,直接替换,没有括号,上面的表达式变为: m=m+m*m+m=15.

    展开全文
  • 所有的参数都加括号,然后整个表达式在加上一个括号 错误示例: #include <stdio.h> #define RECTANGLE_AREA1(a, b) a * b #define RECTANGLE_AREA2(a, b) (a * b) #define RECTANGLE_AREA3(a, b) (a) * (b) ...

    宏只是简单的代码替换,不会像函数一样先将参数计算后,再传递
    在使用带参数的宏的时候要注意:
    所有的参数都加括号,然后整个表达式在加上一个括号

    错误示例:

    #include <stdio.h>
    
    #define RECTANGLE_AREA1(a, b) a * b
    #define RECTANGLE_AREA2(a, b) (a * b)
    #define RECTANGLE_AREA3(a, b) (a) * (b)
    int main(void)
    {
    	int a = 1;
    	int b = 2;
    	int c = 3;
    	int d = 4;
    	int base = 10;
    	int ret = 0;
    	
    	/* 本意是:base/(a*b),实际宏展开为:base/a*b,造成错误 */
    	ret = base / RECTANGLE_AREA1(a, b);
    	
    	/* 本意是:base/((a+b)*(c+d)),实际宏展开为:base/(a+b*c+d),造成错误 */
    	ret = base / RECTANGLE_AREA2(a + b, c + d);
    	
    	/* 本意是:base/((a+b)*(c+d)),实际宏展开为:base/(a+b)*(c+d),造成错误 */
    	ret = base / RECTANGLE_AREA3(a + b, c + d);
    	
    	return 0;
    }
    

    综上,最保险的方法涉及到的参数全部加括号,然后整个表达式再加上一个括号

    #define RECTANGLE_AREA(a, b) ((a) * (b))  
    

    对于普通的宏(不带参数),也要注意:
    如果是正数,则不用加括号
    如果是负数,需要将整个负数加括号
    如果是表达式,需要整个表达式要加括号

    下面的代码都是limits.h头文件中的相关的宏定义

    /* Minimum and maximum values a `signed short int' can hold.  */
    #  define SHRT_MIN	(-32768)
    #  define SHRT_MAX	32767
    

    可以看到负数要加括号,正数不需要加括号
    我暂时没有想到怎么构造错误的示例,但是负数如果不加括号肯定是有问题的
    因为数组下标[],圆括号(),成员选择(对象).,成员选择(指针)->的优先级都比负号要高

    /* Minimum and maximum values a `signed int' can hold.  */
    #  define INT_MIN	(-INT_MAX - 1)
    #  define INT_MAX	2147483647
    

    可以看到,如果是一个表达式,那么整个表达式也要加括号
    这个错误示例就比较好构造了

    #include <stdio.h>
    
    #define INT_MIN -INT_MAX - 1
    #define INT_MAX 2147483647
    int main()
    {
        double a = 0.5;
        double b = 0;
        /* 本意是:(-INT_MAX-1)*a,实际宏展开为:-INT_MAX-1*a,造成错误 */
        b = INT_MIN * a;
        return 0;
    }
    
    展开全文
  • 最近面试的时候 面试官让我写了一个用宏定义返回两个参数中的较小值,我直接就写了 #define min(a,b) (a<b)?a:b 然后面试官问了我一句需要写括号么,当时问的有些懵,犹豫之后说应该不需要了吧。 回来之后就...

    最近面试的时候 面试官让我写了一个用宏定义返回两个参数中的较小值,我直接就写了

    #define min(a,b) (a<b)?a:b   
    

    然后面试官问了我一句需要写括号么,当时问的有些懵,犹豫之后说应该不需要了吧。

    回来之后就仔细查了一下,发现自己还是犯了错误。

    首先我们需要知道宏定义是怎么在代码中使用的,在代码预编译阶段,宏定义是直接替换的

    例如:
    在代码中我们使用了min(a,b),而在代码预编译阶段就会直接将min(a,b) 直接替换成a<b?a:b

    因为替换的原因,所以就可能会存在一些问题

    例如:

    #include<stdio.h>
    #define min(a,b) (a>=b)? b:a
    int mina(int a,int b){
    return a>=b? b:a;
    }
    int main(){
    printf("宏定义结果:%d\n",min(3,1)-1);
    printf("函数结果:%d",mina(3,1)-1);
    }
    

    我们会发现运算的值
    宏定义结果:1
    函数结果:0

    这里出现的问题就是因为优先级问题,当宏定义直接被替换成(a>=b)? b:a之后可以看成

    printf("宏定义结果:%d\n",(3>=1)? 1:3-1);
    

    这样答案应该就很明显了

    所以宏定义中增加括号会增强代码的健壮性以及安全性

    展开全文
  • C语言宏定义讲解

    千次阅读 多人点赞 2019-04-28 21:13:17
    详细讲解了C语言的两大宏定义
  • 要写好C语言,漂亮的宏定义是非常重要的。宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。  在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为...
  • 笔记整理:宏定义宏定义的一般形式为:#define 宏名 字符串或者表达式预处理的工作就是替换,就是将宏名替换成相应的字符串与表达式宏定义字符串:#define 宏名 字符串该示例中的语句int sum = 20 N;,N被100代替...
  • 1、宏定义说明 宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。 常见的宏定义有两...
  • C语言宏定义浅析

    2016-09-22 10:14:54
    动机前几天看到一个面试题:写一个“标准”宏MIN,这个宏输入两...平时也会用到宏定义,对于宏的理解还不特别深入,重新看了Kernighan的C程序设计语言中关于宏部分,特次记录.宏定义的本质#define 名字 替换文本宏的
  • C语言宏定义用法总结

    万次阅读 多人点赞 2017-06-01 16:42:22
    本博文主要是总结#define的用法,包括定义符号与定义宏macro。预处理器的作用编译一个C语言程序的第一步骤就是预处理阶段,这一阶段就是发挥作用的阶段。C预处理器在源代码编译之前对其进行一
  • 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧、传参、传返回值等一系列工作,因此那些简短并且被频繁调用的函数经常用函数式宏定义来代替实现...
  • c语言宏定义

    2019-01-08 09:18:22
     #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,...
  • C语言宏定义总结

    2015-06-12 15:13:27
    C语言宏定义总结 转自:http://topcool99.ycool.com/post.1797687.html 宏定义了一个代表特定内容的标识符。  预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。  宏最常见的用法是定义代表某个值...
  • C语言宏定义使用技巧

    千次阅读 2016-02-29 11:49:07
    写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF...
  • C语言 宏定义相关

    2016-12-14 00:05:52
    宏定义相关 注意点 1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 在宏中小心地把参数用括号括起来。 2)懂得预处理器将为你计算常数表达式的值,不必计算出实际的值。 3) 如果,意识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,027
精华内容 7,210
关键字:

c语言宏定义表达式的括号

c语言 订阅