zoukankan      html  css  js  c++  java
  • 03.函数

    函数声明与调用

    最好应把函数的声明写在主函数前面,函数的具体实现写在主函数后面。C/C++是一趟编译的语言,要想使用一个函数,必须在使用函数前有该函数的声明,否则无法使用。

    函数调用

    主调(客户)函数与被调(服务器)函数

    函数调用时的参数与返回值

    函数原型

    函数的实现与调用格式说明:作为函数接口

    一般出现在头文件中

    格式:函数返回值类型 函数名称(形式参数列表);

    例一:

    int Add(int x, int y);
    

    例二:

    void Swap(int x, int y);
    

    函数定义

    int Add(int x, int y)
    {
        int t;
        t = x + y;
        return t;
    }
    
    void Swap(int x, int y)
    {
        int t;
        t = x;
        x = y;
        y = t;
        return;   //因函数没有返回值,只需直接列出return语句。return在函数末尾时也可以省略。
    }
    

    函数实现

    函数定义,使用编程语言给出函数的执行步骤

    函数返回值

    函数完成后带回来的结果

    主调函数可以使用

    int Compare(int x, int y)
    {
        int t;
        if(x == y)
            t = 0;
        else if(x > y)
            t = 1;
        else
            t = -1;
        return t;
    }
    //允许函数中包含多个return语句
    //函数在执行到第一条return语句后终止
    int Compare(int x, int y)
    {
        if(x == y)
            return 0;
        else if(x > y)
            return 1;
        else
            return -1;
    }
    

    谓词函数

    返回bool类型值的函数

    表达某项任务是否完成或某个条件是否满足

    bool IsLeap(int year)
    {
        return year % 4 == 0 && year & 100 != 0 || year % 400 == 0;
    }
    

    函数重载

    定义同名但参数不完全相同的函数(参数个数、参数类型、参数的顺序可以不相同)

    实例:

    int Max(int x, int y);
    char Max(char x, char y);
    bool Max(bool x, bool y);
    

    函数调用规范

    函数调用示例

    编写程序讲用户输入的两个整数相加,要求尽可能使用函数将程序中的操作独立出来。

    #include<iostream>
    using namespace std;
    void Welcome();
    int GetInteger(int idx);
    int Add(int x, int y);
    void Print(int x, int y);
    int main()
    {
        int a, b;
        Welcome();
        a = GetInteger(1);
        b = GetInteger(2);
        Print(a, b);
        return 0;
    }
    void Welcome()
    {
        cout<<"The program gets two integers, and prints their sum."<<endl;
        return;
    }
    int GetInteger(int idx)
    {
        int t;
        cout<<"No."<<idx<<" ";
        cin>>t;
        return t;
    }
    int Add(int x, int y)
    {
        return x + y;
    }
    void Print(int x, int y)
    {
        cout<<x<<" + "<<y<<" = "<<Add(x, y)<<endl;
        return;
    }
    

    参数传递机制:值传递与引用传递

    值传递机制

    • 形式参数在函数调用时才分配存储空间,并接受实际参数的值
    • 实际参数可以为复杂的表达式,在函数调用前获得计算
    • 形式参数与实际参数可同名,也可不同名
    • 参数较多时,实际参数值逐一赋值,它们必须保持数目、类型、顺序的一致
    • 值的赋值过程是单向不可逆的,函数内部对形式参数值的修改不会反映到实际参数中去
    • 函数参数一般为函数输入集的一部分,函数输出集一般使用返回值表示,只有使用特殊的手段才可以将函数参数作为函数输出级的一部分。

    函数调用栈框架

    示例:

    #include<iostream>
    using namespace std;
    void Welcome();
    int GetInteger(int idx);
    void Swap(int x, int y);
    int main()
    {
        int a, b;
        Welcome();
        a = GetInteger(1);
        b = GetInteger(2);
        cout<<"In main(): a: "<<a<<"; b: "<<b<<endl;
        Swap(a,b);
        cout<<"In main(): a: "<<a<<"; b: "<<b<<endl;
        return 0;
    }
    void Welcome()
    {
        cout<<"The program swap the two integer's value."<<endl;
    }
    int GetInteger(int idx)
    {
        int t;
        cout<<"No."<<idx<<" ";
        cin>>t;
        return t;
    }
    void Swap(int x, int y)
    {
        cout<<"In Swap(): x: "<<x<<"; y: "<<y<<endl;
        int t;
        t = x;
        x = y;
        y = t;
        cout<<"In Swap(): x: "<<x<<"; y: "<<y<<endl;
    }
    

    程序运行结果:

    The program swap the two integer's value.
    No.1 3
    No.2 4
    In main(): a: 3; b: 4
    In Swap(): x: 3; y: 4
    In Swap(): x: 4; y: 3
    In main(): a: 3; b: 4
    

    程序实际未能将a、b互换,因为值的赋值过程是单向不可逆的,函数内部对形式参数值的修改不会反映到实际参数中去.

    要真正互换a、b的值需将a、b定义为全局变量,写在所有函数声明的前面,a、b可以被所有的函数使用。程序变为:

    #include<iostream>
    using namespace std;
    int a, b;  //全局数据对象声明,以保证所有函数都可以访问这两个数据对象
    void Welcome();
    int GetInteger(int idx);
    void Swap();   //不再需要函数参数
    int main()
    {
        int a, b;
        Welcome();
        a = GetInteger(1);
        b = GetInteger(2);
        cout<<"In main(): a: "<<a<<"; b: "<<b<<endl;
        Swap();
        cout<<"After Swap,In main(): a: "<<a<<"; b: "<<b<<endl;
        return 0;
    }
    void Welcome()
    {
        cout<<"The program swap the two integer's value."<<endl;
    }
    int GetInteger(int idx)
    {
        int t;
        cout<<"No."<<idx<<" ";
        cin>>t;
        return t;
    }
    void Swap() //可以直接访问a、b
    {
        int t;
        t = a;
        a = b;
        b = t;
    }
    

    程序运行结果:

    The program swap the two integer's value.
    No.1 1
    No.2 2
    In main(): a: 1; b: 2
    After Swap, in main(): a: 1; b: 2
    

    虽然这样可以交换a、b的值,但却因此定义了不必要的全局变量,本无需访问a、b的Welcome()也可访问对a、b。应尽量避免这类做法,换而使用引用传递的方法。

  • 相关阅读:
    Catalan数
    C# & LINQ 对象克隆
    Rotate Image
    反转链表
    QtCreator调试程序时GDB崩溃
    Regular Expression Matching
    Wildcard Matching
    DFA与NFA
    Set Matrix Zeroes
    PCA原理
  • 原文地址:https://www.cnblogs.com/bear-Zhao/p/13619838.html
Copyright © 2011-2022 走看看