C语言自学完备手册(18)——宏

自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


版权声明


对象式宏

语法概述:

#define a b

作用:将a替换为b

示例如下:

#include <stdio.h>
#include <stdlib.h>

#define NUMBER 5
int main()
{
    int i;
    for(i=0;i<NUMBER;i++){
        printf("i=%d\n",i);
    }
    return 0;
}

运行结果:

i=0
i=1
i=2
i=3
i=4

Process returned 0 (0x0)   execution time : 1.179 s
Press any key to continue.

通过定义宏NUMBER,在程序编译执行时会将NUMBER替换成5。

注意:

  • 宏名一般采用大写
  • 定义宏的语句的末尾没有分号(;)
  • 对象式宏不能用来替换字符串字面量和字符常量中的部分内容
  • 对象式宏不能用来替换变量名等标识符中的部分内容

函数式宏

先来做个练习:利用函数求整数和小数的平方值

代码如下:

#include <stdio.h>
#include <stdlib.h>
int sqr_int(int x){
    return x*x;
}

double sqr_double(double y){
    return y*y;
}

int main()
{
    int x;
    double y;
    x=sqr_int(5);
    y=sqr_double(1.3);
    printf("计算结果是:%d %f",x,y);
    return 0;
}

在该示例中,写了两个函数来分别计算整数的平方和小数的平方。其实,它们的本质是相同的——把两个数相乘作为结果;差别就在于数据类型的不一样。此时,我们就可以用函数式宏来进行代码的优化,代码如下:

#include <stdio.h>
#include <stdlib.h>

#define sqr(x) ((x)*(x))

int main()
{
    int x;
    double y;
    x=sqr(5);
    y=sqr(1.3);
    printf("计算结果是:%d %f",x,y);
    return 0;
}

在该示例中定义了一个函数式宏,即代码第4行:

#define sqr(x) ((x)*(x))

所以,代码中的sqr(x)均会替换成((x)*(x));例如:
sqr(5) 会被替换成((5)*(5))
sqr(1.3)会被替换成((1.3)*(1.3))


函数式宏与逗号表达式

C语言中有一个较为特殊的运算符——逗号运算符(,)。
该运算符用于连接两部分,它的计算过程如下:

先求表达式1,后求表达式2;最终结果是表达式2的值

例如:
(3+5,6+8) 先求3+5的值为8,再求6+8的值为14;最终的结果为14

(a=2*5,a*4) 先求a=2*5得到a的值是10,再求a*4的值是40;最终的结果是40

逗号表达式小结:

  • 逗号表达式按照从左至右的顺序计算
  • 逗号表达式作的最终结果为最后一个表达式的计算值
  • 逗号表达式在所有运算符中的优先级非常低

明白了逗号表达式再来看看函数式宏和逗号表达式的应用,代码如下:

#include <stdio.h>
#include <stdlib.h>

#define puts_alert(str) (puts("提示信息:"),puts(str))

int main()
{
    printf("请您输入一个整数:\n");
    int number;
    scanf("%d",&number);
    if(number==0){
        puts_alert("您输入的数字是0");
    }else{
         puts_alert("您输入的数字不是0");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lfdfhl/article/details/81084766