美文网首页程序员
C语言之函数与预编译= =

C语言之函数与预编译= =

作者: keeeeeenon | 来源:发表于2019-03-20 20:19 被阅读0次

    函数定义

    C语言程序框架
    C语言程序的框架有两种:

    1.一个main()单框架
    2.一个main()+多个子函数复合框架
    

    注意:
    1.一个源程序文件可由一个或多个函数组成之函数
    2.一个C语言程序可以由一个或多个源程序文伊组成。
    3.C程序执行总是从main()开始,结束于main()结束;可调用其它函数
    4.函数不能嵌套定义,但可以互相调用,不能调用main()

    C语言函数分类
    函数的分类:
    (1)无参函数和有参函数
    (2)库函数和用户自定义函数+main()

    函数定义
    1、函数定义

    函数返回值类型  函数名(形式参数列表)
    {
      函数体;
    }
    

    说明:
    (1)函数体可以没有语句,但不能没有花括号,函数名后必须有一对小括号
    (2)定义有参函数时,形参的定义可以采用传统方式或现代方式两种。
    传统方式:

    int max(x,y)
    Int x,y,不能定义形参以外的其它变量
    {}
    现代方式:
    int max(int x,int y)
    {}
    

    说明:
    (3)不能在定义函数时在函数首部小括号后直接跟分号
    如:

    float fun(int x,int y);{}
    

    (4)定义函数时,必须采用传统方式或现代方式指定形参的类型

    函数调用

    2、函数调用:两种方式

    方式1:非void型
    变量名=函数名(实参列表)
    方式2:void型
    函数名(实参列表);
    

    例一:

    int fun(int x,int y)
    { return x>y?x:y; 
    }
    main()
    {
    int a=9,b=7;max; 
    max=a;
     max=fun(max,b); 
    printf("max=%d",max);
    }
    

    结果:9
    例二:

    void fun(int x,int y)
    int z; z=x>y?x:y;
    printf("z=%d",z); 
    main()
    {
    int a=7,b=9;max;
    max=a;
    fun(max,b);
    printf("max=%d",max);
    }
    

    结果:z=9max=7

    函数使用例题分析

    3、函数使用例题分析
    (1)原型声明
    方式1:#include<头文件>
    方式2:声明的格式:
    函数类型 函数名(形参类型1形参1,形参类型2形参2…);
    函数类型 函数名(形参类型1,形参类型2…);

    原型声明

    定义在上,调用在下
    口诀:有头有体无分号----定义
    有头有分号------原型声明语句
    函数名(实参)----调用

    函数调用过程

    (2)函数调用过程
    在进行函数调用时系统将实参值对应地(按位置次序对应)传给形参,是一种值的单向传递。
    实参与形参之间有一个关系。
    三一致:参数类型,次序,数量

    在函数中的变量

    1.函数定义与使用

    有头有体无分号:函数定义
    有类型有分号为函数声明语句

    2.变量三属性

    属性:类型(定义)、作用范围(内部,局部,外部,全局)、存储类别(4种:auto,static,register,extern----说明类别 )

    类型

    类型名 变量名列表;

    例如:int x,y,z;
    
    作用范围

    分为:局部变量和全局变量
    (1)局部变量(或称内部变量)
    定义:在一个函数内部定义的变量为局部变量
    a.局部变量只能在它所在的函数内有效。
    b.在不同的函数中可以出现同名的变量,它们分别作用于不同的变量。(互不影响互不干扰)
    c.复合语句中定义的变量只能在此复合语句中
    d.所有形式参数都是局部变量。
    例:

    main(){
    int a=3,b=9;
    {
      int a=1,c=7; 
      a=a+b;
      b=c+a; 
      printf(a=%d,b=%d",a,b); 
    }
    printf("a=%d,b=%d,"a,b);
    }
    输出结果为:a=10,b=17a=3,b=17
    

    (2)全局变量(或称外部变量)
    定义:在函数外部定义的变量为全局变量
    a.全局变量的有效范围是在本文件内从定义该变量的位置开始到本文件的结束。
    b.全局变量可以在它的有效范围内被每个函数引用。
    c.在同一文件中若全局变量与局部变量同名,局部量“屏蔽”全局变量。
    例:

    int a;
    void funl()
    {
    a=100;
    }
    void fun2()
    { 
    a=1000; 
    }
    main()
    {
    a=10000;
    }
    //最终a被改为10000
    

    例:

    # include<stdio.h>
    int a,b; 
    void fun()
    {a=100; b=200; 
    }
    main()
    { int a=5,b=7;
     fun();
     printf("%d%d\n",a,b);
    }
    //运行结果为:57
    全局变量与局部变量同名时:局部变量屏蔽掉全局变量,局部变量有效性高于局部变量
    
    存储类别

    (1)auto类别变量
    a.auto类别变量用完后释放所占用空间。(生命周期短)
    b.局部变量默认为auto类别,无初始化时,初值为随机值。
    c.使用时间短,一般都为auto类别变量(临时性变量)
    (2)static类别变量(生命周期长)
    a.static类别从定义到程序运行结束均占用存储空间。
    b.全局部变量默认为static类别,无初始化时,初值为0。
    c.static类别变量只进行一次初始化。
    例:

    #include<stdio.h>//静态变量static 
    int fun(int x,int y)
    {static int m=0,i=2;
    i+=m+1;
    m=i+x+y;
    return m;
    }
    main()
    {intj=4,m=1,k;
    k=fun(j,m);
    printf("%d",k);
    k=fun(j,m);
    printf("%d",k);
    }
    //输出结果:817
    

    例:

    #include<stdio.h>//静态变量static 
    int d=1;
    fun(int p)
    {static int d=5;
    d+=p;
    printf(%d",d);
    return(d);
    }
    main()
    {int a=3;
    printf("%d\n",fun(a+fun(d)));
    }
    输出:61515
    

    (3)register类别变量(寄存器类别)
    a.register类别只能是局部变量才能被说明。
    b.一般不能直接使用。

    (4)extern类别变量
    a.extern类别变量可以加大变量的作用范围
    b.两个说明格式
    格式1:定义同时说明类别:
    存储类别类型名变量名;
    格式2:分别定义、说明
    类型名变量名;存储类别变量名;

    预编译命令

    1、预编译命令

    标志:#
    文件包含(include)
    如:#include<>//在指定的标准搜索路径下搜索该库文件
    如:#include""//扩大搜索范围,除了在标准搜索路径下搜索该库文件,还会在当前工作目录及其子目录下搜索

    2、宏

    define

    第一种:无参宏定义
    格式:#define 宏名 宏内容
    功能:用一个指定的标识符(宏名大写)来代表一串字(宏内容)
    如:#define PI 3.141592
    如:#define N 10
    宏名:符号常量,无语法检查,无类型
    注:
    (1)宏名我们一般用大写字母表示,遵守用户自定义标识符命名规则。
    如:#define PI abcdefg
    (2)#define可以在函教外定义也可以在函数内定义,但该命令应该在单独一行上。

    undef命令可以提前终止宏名的作用域。

    (3)在进行宏定义时,可以引用已经定义的宏名进行层置换。
    (4)在进行宏替换时,必须先替换完所有的宏后再运算,同时替换过程中不能乱加括号。
    口诀:原样替换,先替换,不要乱加括号,再按优先级计算
    第二种:带参宏定义
    如:#define宏名(参数列表)宏内容
    功能:提供了一种更加灵活的替换方式。
    如:#define s(x,y)x*y+2
    注:
    (1)在定义有参宏时,参数列表必须用一对小括号括起且小括号和宏名之间不能有空格
    (2)对有参宏名进行替换时,需要将形参改成相应的实参,并且注意分清形参和实参的对应关系

    例1:
    #define N 5+4
    a=N*N+30;====>5+4*5+4+30===>59
    a=Num+30;
    例2:
    #define s(a,b)a*b
    例3:
    #defines(a,b)a*b
    

    # include<stdio.h>
    # define s(a,b) a*b
     main()
    { printf("s=%d",s(3,5)); //===>s=15
    printf("s=%d",s(3+2,5+7));// ==>s=20
    printf("s=%d",s((3+2),(5+7)));//===>s=60
    }
      
    

    例:

    # include<stdio.h>
    # define SQR(x) x*x 
    main()
    { int a=16,k=2,m=1; 
    a/=SQR(k+m)/SQR(k+m);// ==》a/=2+1*2+1/2+1*2+1==>a=a/7=>2
    printf("%d",a);
    }
    //结果:2
    

    复习例1:

    # include<stdio.h>
    int a=1;
     mian()
    { int s=3;
    { int a=5;s+=++a;}
    s+=++a; 
    printf("% din",s);
    }
    结果:11
    

    例2

    # include<stdio.h>
    int w=3; 
    fun(int k)
    { if(k==0) return w; 
    return(fun(k-1)*k);
    }
     main()
    {
    int w=10; 
    printf("% d\n", fun(5)*w);
    }
    // 递归:几条语句,画图
    结果:3600
    

    简化:

    # include<stdio.h>
    int w=3; 
    fun(int k)
    { if(k==3) return w ;
        return(fun(k-1)*k);
    }
     main()
    {
    int w=10; 
    printf("% d\n", fun(5)*w);
    } 
    结果:600
    

    例:

    int a,b; 
    void fun()
    {
    a=100;
    b=200;
    }
    main()
    {int a=5,b=7;
     fun();
     printf("%d%d",a,b);
    }
    结果:57
    

    相关文章

      网友评论

        本文标题:C语言之函数与预编译= =

        本文链接:https://www.haomeiwen.com/subject/nutxvqtx.html