zoukankan      html  css  js  c++  java
  • 关于宏的定义注意事项

    定义: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

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

  • 相关阅读:
    题目一: 写一个Java程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。
    个人简介
    读《构建之法》有感
    四_测试网站管理系统
    一_测试入门
    三_白盒测试
    个人简介
    二_单元测试和代码覆盖率
    第五次博客作业 初读《构建之法》的心得体会
    第三次 博客作业
  • 原文地址:https://www.cnblogs.com/ltlly/p/4110023.html
Copyright © 2011-2022 走看看