《C语言教程》14章 函数


一、函数、参数、返回值

学习C语言就一直在和函数打交道,例如main函数、printf函数等。其它语言中的过程和函数,在C语言里面都称为函数。所谓“过程”也就是没有返回值的函数。

编写一个函数不要忘记功能说明,这是函数的一部分,小雅在后面的教程中将省略,大家在工作中不能省略。同时不要忘记return语句,即使什么也不做,也得在函数结束前加上return语句。


#include <stdio.h>

/**********************************
 * 功  能: 递归法求整数的阶层    *
 * 函数名: fact                  *
 * 参  数: int     一个整数      *
 * 返回值: int     整数的阶层    *
 **********************************/
int fact(int n)
{
    //终止条件
    if (n == 1) {
        return 1;
    }
    //递归调用n-1的阶层
    else {
        return n * fact(n-1);
    }
}

/**********************************
 * 功  能: 计算整数的阶层        *
 * 函数名: main                  *
 * 参  数: (void)                *
 * 返回值: (void)                *
 **********************************/
int main(void)
{
    int num;
    int result;

    printf("请输入一个整数:");
    scanf("%d", &num);     //输入一个整数

    //求整数的阶层
    result = fact(num);
    printf("%d的阶层=%d\n", num, result);

    return 0;
}

二、return和exit、assert的区别

return语句是结束当前函数。而exit是结束main()函数,即整个程序,一般都是在遇到非常错误时才调用exit()。assert()是一个宏定义,在assert.h中申明,用来在DEBUG方式诊断程序,当参数中的条件不成立时,中断main()函数。建议多多使用assert()。


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

/**********************************
 * 功  能: 申请内存空间          *
 **********************************/
char *getMemory(size_t len)
{
    char *buffer;

    //len>=15时正常运行,否则异常退出
    assert(len >= 15);
    
    buffer = (char *)malloc(len);
    if (!buffer) {       //未申请到空间则异常退出
        exit(-1);
    }

    return buffer;       //正常返回
}

/**********************************
 * 功  能: 教学测试主程序        *
 **********************************/
int main(void)
{
    char *p;
    int num;

    while (1) {
        printf("请输入一个整数:");
        scanf("%d", &num);    //输入一个整数

        //申请空间
        p = getMemory(num);

        //拷贝字符串并输出
        strcpy(p, "www.quanxue.cn");
        printf("%s\n", p);
        free(p);     //这句千万不能忘记
    }

    return 0;
}

三、函数的申明

上面的例子中,main()都放在最后,如果放在前面,编译时就会告知某函数未定义。解决此问题就需要在main()前面申明一个后面的函数。申明时,参数可以只用类型,而不用参数名,甚至参数类型也不写。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

char *getMemory(size_t);    //申明后面要用的函数

/**********************************
 * 功  能: 教学测试主程序        *
 **********************************/
int main(void)
{
    char *p;
    int num;

    while (1) {
        printf("请输入一个整数:");
        scanf("%d", &num);    //输入一个整数

        //申请空间
        p = getMemory(num);

        //拷贝字符串并输出
        strcpy(p, "www.quanxue.cn");
        printf("%s\n", p);
    }

    return 0;
}

/**********************************
 * 功  能: 申请内存空间          *
 **********************************/
char *getMemory(size_t len)
{
    ......
}