• 关于宏的定义注意事项


    定义:C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。

    对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

    带参宏定义的一般形式为:
        #define  宏名(形参表)  字符串
    在字符串中含有各个形参。

    带参宏调用的一般形式为:
        宏名(实参表);

    特别注意事项:

    如:求(a+1)^2的值,用宏定义;

    #include <stdio.h>
    #define Square(x) x*x
    int main()
    {
    int x;
    int sum;
    printf("please input one number ");
    scanf("%d",&x);
    sum=Square(x+1);
    printf("the sum is %d",sum);
    return 0;
    }

    please input one number

    23

    the sum is :47

    ???????? 为什么是47?而不是529?

    原来是这样子的,x+1带入到宏中变成了------->x+1*x+1 再把x=23带入式子中可得:47。

    那又有什么办法可以得到我们需要的x^2呢?办法是有的,如下:

    ---------------------------------------

    第一种方法:

    #include <stdio.h>
    #define Square(x) x*x
    int main()
    {
    int x;

    int y;//------此处增加一个变量用来接收y=x+1的值
    int sum;
    printf("please input one number ");
    scanf("%d",&x);

    //---------此处增加y=x+1;
    sum=Square(x+1);//-----此处变更下 sum=Square(y);
    printf("the sum is %d",sum);
    return 0;
    }

    输出:

    please input one number

    23

    the sum is :529

    ----------------------------------------

    第二种方法:

    #include <stdio.h>
    #define Square(x) x*x//------此处更改成:#define Square(x) (x)*(x)
    int main()
    {
    int x;
    int sum;
    printf("please input one number ");
    scanf("%d",&x);
    sum=Square(x+1);
    printf("the sum is %d",sum);
    return 0;
    }

    解析:(x+1)*(x+1)

    输出:

    please input one number

    23

    the sum is :529

    这样就可以得到我们所想要的答案了,哎对了,是不是这样,我们的程序就算完成了呢?

    其实还没有完,假如我们的Square(x+1)/n后,那又会是怎么样的呢?

    如下:

    #include <stdio.h>
    #define Square(x) (x)*(x)
    int main()
    {
    int x;
    int sum;
    printf("please input one number ");
    scanf("%d",&x);
    sum=Square(x+1)/2;
    printf("the sum is %d",sum);
    return 0;
    }

    输出:

    please input one number

    23

    the sum is :288

    解析:从我们本意上来讲,我们应该是529/2=264才对,可答案却是288?

    原来现在变成这样子了:(x+1)*(x+1)/2----->带入x=23后,自然答案是288

    那么又怎么样变成我们的需求呢?

    如下:

    #include <stdio.h>
    #define Square(x) (x)*(x)//-------此处更改成:#define Square(x) ((x)*(x))
    int main()
    {
    int x;
    int sum;
    printf("please input one number ");
    scanf("%d",&x);
    sum=Square(x+1)/2;
    printf("the sum is %d",sum);
    return 0;
    }

    输出:

    please input one number

    23

    the sum is :264

    只有这样子我们的程序逻辑才算紧密,特写下,算作日后查阅学习之用。

  • 相关阅读:
    第 17 章 责任链模式【Chain of Responsibility Pattern】
    第 16 章 观察者模式【Observer Pattern】
    第 15 章 组合模式【Composite Pattern】
    第 14 章 迭代器模式【Iterator Pattern】
    第 13 章 装饰模式【Decorator Pattern】
    第 12 章 命令模式【Command Pattern】
    第 11 章 桥梁模式【Bridge Pattern】
    第 10 章 建造者模式【Builder Pattern】
    编写高质量代码改善C#程序的157个建议——导航开篇
    C#实现简易ajax调用后台方法
  • 原文地址:https://www.cnblogs.com/ltlly/p/4110023.html
Copyright © 2020-2023  润新知