• 温故而知新_C语言_define_宏


                                                                                             define

    define是C语言的预处理,作用是宏定义。

    所谓宏,是将一些命令组织在一起,作为一个单独命令完成一个特定任务。

    预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等

    一般都放在源文件的前面,它们称为预处理部分。

    所谓预处理是指在进行编译之前所作的工作。 在进行编译C语言源程序的前一个步骤就是预处理。

     define可以定义函数,常量(也就是定义一个不可变的变量,包括字符,字符串)。                                     

    使用方式:

    (1)定义常量

         

    #include<string.h>
    #include<stdio.h>
    #define PI 3.14
    #define PI_Name "pi is"
    
    int main(void)
    {
         printf("%s	%f",PI_Name,PI); //	是TAB。输出宏
    }

    定义了两个宏,一个数字,一个字符串。

    我们使用正常的方式可以输出。

    他们是不可修改的常量。如果对其修改,会报错。

     (2)定义函数(有参数)

    定义函数可以分为有参数,无参数(定义表达式)两种。

    #include<string.h>
    #include<stdio.h>
    #define A (a,b)(a)+(b)
    
    
    int main(void)
    {
        int x=A(12,11);
         printf("%d",x);
    }

    我们定义一个宏,是一个带有参数的宏。

    A函数带有a,b两个参数,并返回a+b的值。

    为什么a+b要写成(a)+(b)呢?

    是为了保证运算。

    请看下面的例子

    #include<string.h>
    #include<stdio.h>
    #define A(a)a*a
    
    int main(void)
    {
        int x,c=2;
        x=A(c+1);
         printf("%d",x);
    }

    我们希望返回a*a值。

    此代码我们在A函数中填入的C+1也就是3,A函数返回的值应该是9。

    但确实返回的5,这与我们所期望的值有很大的偏差。

    因为,A(c+1)拆开后等于c*c+1所以等于5。

    如果我们将a*a加上括号

    不出所料,我们得到正确的值。

    这回将宏拆开。

    A(C+1)=(c+1)*(c+1)

    括号将运算的优先级提高了。所以会得到一个正确的值。

    但是!

    有时候加这么样加括号还是不好用的! 为什么呢?请我们考虑一下运算的优先级。

    请看下面的代码

    #include<string.h>
    #include<stdio.h>
    #define A(a)(a)*(a) 
    int main(void)
    {
        int x,c=2;
        x=99/A(c+1);
         printf("%d",x);
    }

    在上面的代码中A函数返回值是9,我们这把依旧让返回值等于9,不过我们让X的值等于99/A(c+1).

    我们希望得到的值是11。

     但是我们为什么得到的却是99呢?

    因为优先级的关系,99/A(c+1)等于99/(c+1)*(c+1)也就是99/3*3,所以的值是99。

    那怎么解决呢?

    我们根据A函数的含义,将A函数内的表达式的预算优先级提高。

    也就是

    #include<string.h>
    #include<stdio.h>
    #define A(a)((a)*(a)) 
    int main(void)
    {
        int x,c=2;
        x=99/A(c+1);
         printf("%d",x);
    }

    OK

     

     (3)定义函数(无参数)(定义表达式)

    其实定义常量也算是定义函数无参数的一种,但是我为了好区分这两种定义宏的区别,特地分开。

    毕竟定义的方法上有一定的区别。

     

    #include<string.h>
    #include<stdio.h>
    #define A (a+3)
    int main(void)
    {
        int x,a=6;
        x=99/A;
         printf("%d",x);
    }

    我们依旧是定义一个A“函数”,但是无参数。

    这回这个A“函数”可以理解为一个表达式。

    请注意看在代码中使用A“函数”的方式,并没有括号,也就是A“函数”不接受参数。而且在再宏定义的时候A“函数”内a是存在代码内。

    这种行为,更像是一种提前定义好的表达式。其中的“参数” 都是必须严格符合A“函数”。

    也就是x=99/A;这句等于x=99/(a+3)

     当然这句话也要考虑优先级的问题。所有A“函数”加上了括号。

    因为是我想要a+3,根据含义,最后形成了A(a+3)这个样子

  • 相关阅读:
    sql语句去掉前面的0(前导零,零前缀)
    uniapp android升级更新弹窗
    SqlServer查询重复数据
    JS添加新节点
    sql插入多条数据的sql语句
    SqlSerVer 列与逗号分隔字符串 互相转换
    web特殊字符替代码
    中断promise
    js监听数据的变化。
    redux(二、connect provider使用)
  • 原文地址:https://www.cnblogs.com/T-ARF/p/7537874.html
Copyright © 2020-2023  润新知