zoukankan      html  css  js  c++  java
  • 温故而知新_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)这个样子

  • 相关阅读:
    zoj 3279 线段树 OR 树状数组
    fzu 1962 树状数组 OR 线段树
    hdu 5057 块状链表
    hdu3487 Play with Chain
    bzoj 1588营业额统计(HNOI 2002)
    poj2823 Sliding Window
    poj2828 Buy Tickets
    poj2395 Out of Hay
    poj3667 Hotel
    poj1703 Lost Cows
  • 原文地址:https://www.cnblogs.com/T-ARF/p/7537874.html
Copyright © 2011-2022 走看看