C语言函数语法详解

1、概述

在C语言中,函数是来完成子程序或者某个模块的功能。有主程序或者其他函数调用,其他函数之间可以相互调用。同一函数可以被一个或多个函数任意次调用。
注意:
    a、一个C程序有一个或多个程序模块组成,每一个程序模块作为一个源程序文件。一个源文件可以为多个C程序共用。
    b、程序在编译时是以源文件为单位进行编译,而不是以函数为单位进行编译。一个源文件就是一个编译单元
    c、C程序的执行是从main函数开始,也是在main函数中结束整个程序
    d、所有函数是平行的,即在定义函数时是分别进行的,是互相独立的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数之间可以相互调用,但不能调用main函数。main函数是系统调用的。
    e、从用户使用角度看,函数分为两种:
        (1)标准函数。标准函数即函数库,它由系统提供。不同的C语言编译系统提供的标准函数的数量和功能或有不同,但是基本函数是一样的。
        (2)用户自定义函数。
    f、从函数形式看,函数分为两种:
        (1)有参函数。
        (2)无参函数。在调用函数时,主调函数通过参数向被调函数传递数据

2、函数的定义

定义无参函数的一般形式:
类型表示符 函数名()
{
    声明部分
    语句部分
}
【实】定义无参函数,输出“Hello World”字符串

代码如下:

void show()
{
    printf("Hello World");
}

定义有参函数的一般形式:
类型标识符 函数名(形式参数列表)
{
    声明部分
    语句部分
}
【例】传递两个int的参数a和b,然后计算a加b的和,然后返回a加b的和。

代码如下:

int add(int a, int b)
{
    int t = 0; // 声明部分
    t = a + b;
    return t;
}

空函数就是没有函数体的函数,如:

void test(){ ... }

调用空函数时,什么工作也不做,没有任何实际作用。在程序设计中往往程序初期只实现基本功能,对于高级功能我们可以提供一空函数,以后实现该空函数。

定义函数时指定的参数称为“形参”,调用函数时传递的参数称为“实参”。
    a、在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占用的内存单元也被释放。
    b、实参可以是常量、变量或表达式,如:max(3, a+b);
    c、在被定义的函数中,必须指定形参的类型
    d、实参和形参的类型应相同或赋值兼容。
    e、在C语言中,实参向形参数据传递是“值传递”,单向传递,只由实参传递给形参,而形参不能传递给实参。在内存中形参和实参是不同的内存单元。因此,改变形参的值不会影响实参的值。

3、函数的返回值

通常,希望通过函数调用是主调函数能得到一个确定的值,这就是函数的返回值。
    a、函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。如果需要从被调用函数带回一个函数值,被调函数中必须包含return语句。如果不需要从被调函数带回函数值可以不需要return语句。一个函数可以有多个return语句,执行到哪个return语句,哪个语句就起作用。
    b、函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。C语言中,凡是不加类型说明的函数,自动按整型处理。在Turbo C 2.0中不写返回类型可以通过,Turbo C++ 3.0编译时不能通过。所以建议读者在定义时对所有函数都指定函数类型。
    c、在定义函数是指定的类型应该与return返回类型一致。如果函数值的类型和return语句中表达式值类型不一致,则按照函数类型为准。
    d、对于不带回值的函数,应当用“void”定义函数为“无类型”或称“空类型”。此时函数体中不得出现return语句。

4、函数调用
    函数调用的一般形式为:函数名(实参列表);如:

代码如下:

int a = max(2, 4);

按函数在程序中出现的位置来分,可以有以下3种函数调用方式:
    a、函数语句。把函数调用作为一个语句。此时不许要函数返回值。如: show();
    b、函数表达式。函数出现在一个表达式中,这种表达式称为函数表达式,需要函数返回一个确定的值。如:a = 2*max(a, b);
    c、函数参数。函数调用作为一个函数的参数。如:m = max(a, max(b, c));

5、对被调函数的声明和函数原型

在一个函数中调用另一个函数需要具备以下条件:
    a、被调函数必须是已经存在的函数
    b、如果使用函数库,还应该在文本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。如:#include <stdio.h>
        其中“stdio.h”是一个“头文件”。在stdio.h文件中包含了输入输出库函数所用到的一些宏定义信息。如果不包含stdio.h文件的信息,就无法使用输入输出库中的函数。
    c、如果使用用户自己定义的函数,而该函数的位置在调用它的函数的后面(在同一个文件中),应该在主调函数中对被调用的函数进行声明。如:

代码如下:

#include <stdio.h>
void main()
{
    float add(float x, float y); // 或者: float add(float, float);
    float a, b, c;
    scanf("%f%f", &a, &b);
    c = add(a, b);
    printf("sum is %f\n", c);
}
float add(float x, float y)
{
    return x + y;
}

6、局部变量和全局变量

a、局部变量
        在一个函数内部定义的变量是内部变量,它只能在函数范围内才有效,也就是说只在本函数内才能使用它们,在此函数外部不能使用这些变量。如:

代码如下:

float f1(int a)
{
    int b, c;     // b、c变量只在f1函数内部有效
}
char f2(int x, int y)
{
    int i, j;     // i、j变量在f2函数内部有效
}
void main()
{
    int m, n;  // m、n变量在main函数中有效
}

注意:
    1)主函数中定义的变量(m、n)也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。主函数也不能使用其他函数中定义的变量。
    2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
    3)形式参数也是局部变量。
    4)在一个函数内部可以在符合语句中定义变量,这些变量值在本符合语句中有效,这种符合语句称为“分程序”或“程序块”。如:

代码如下:

void main()
{
    int a, b; // a和b在main函数内部有效
    ……
    {
        int c;
        c = a + b; // c在该符合语句中有效
    }
}

b、全局变量
        在函数外部定义的变量就是全局变量。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。如:

代码如下:

int a, b;        // a、b的范围从此处到源文件结尾
float f1()
{
    int b, c;
}
char c1, c2;    //  c1、c2的范围是从此处到原文结尾
char f2()
{
    int i, j;
}
void main()
{
    int m, n;
}

注意:
    (1)全局变量是函数之间交换数据的一个渠道。一般第一个字母大写
    (2)建议不再必要时不要使用全局变量。原因如下:全局变量在程序的全部过程中都占用存储单元、使函数的通用性降低,因为依赖外部变量、使用过多全局变量会降低程序的清晰性
    (3)如果全局变量和局部变量同名,则局部变量优先

7、变量的存储类别

从变量存在的生命周期来看,变量可以分为:静态存储方式和动态存储方式。所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。而动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。

内存中的供用户使用的存储空间的情况。存储空间分为三部分:
(1)程序区
(2)静态存储区。(存放:全局变量)内存空间在程序开始时给全局变量赋值、分配空间,一直保存到程序运行结束才释放,
(3)动态存储区。(存放:函数形参、自动变量、函数调用时的现场保护和返回地址等)调用时才分配空间,调用结束就释放空间。
    在C语言中,每个变量和函数有两个属性:数据类型和数据的存储类别。

存储类别分为量大方式:
    1)、静态存储类别
    2)、动态存储类别

具体包含4种:自动的(auto)、静态的(static)、寄存器(register)、外部的(extern)
a、auto
b、static
c、register
d、extern

8、内部函数和外部函数
a、内部函数
        如果一个函数只能被本文件中其他函数调用,则称为“内部函数”。在定义内部函数时,在函数名和函数类型前面加上static。语法如下:

static 类型标识符 函数名(形参列表);

例如:

代码如下:

static int add(int a, int b);

内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件,在不同的文件中有同名的内部函数,互不干扰。

如:Test.c文件调用Test2.c文件中的void show()方法,输出“Hello World”。
源文件:Test.c

代码如下:

#include <stdio.h>
void main()
{
    extern void show();
    show();
}

源文件:Test2.c

代码如下:

#include <stdio.h>
void show ()
{
    printf("Hello World\n");
}

b、外部函数。
        在定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可以供其他文件调用。如:

代码如下:

extern int max(int a, int b);  // 可以为其他文件调用

C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
   
        在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。

如:Test.c文件调用Test3.c文件中int add(int a, int b)方法,然后返回值,再将返回值传递给Test2.c文件中的show(int result)方法显示出来。
源文件:Test.c

代码如下:

#include <stdio.h>
void main()
{
    extern void show(int result);
    extern int add(int a, int b);
    int result = 0;
    result = add(2, 3);
    show(result);
}

源文件:Test2.c

代码如下:

#include <stdio.h>
void show (result)
{
    printf("result=%d\n", result);
}

源文件:Test3.c

代码如下:

#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}

小伙伴们是否对C语言的函数语法理解的更深刻了呢,希望大家能够喜欢本文。

(0)

相关推荐

  • C语言入门的一些基本资源推荐和程序语法概览

    为什么要学习C语言? 为什么要学习.使用C语言?为什么要学习一个可能比自己都岁数大的编程语言? 选择一门编程语言,"为什么而学"这个目的是最重要的,目的不明确就没法学好.这也是为什么很多学生朋友在大学里必修C语言却觉得没学明白的原因.因为学习的目的不明确,学习当然也没有动力.还有一个原因是C语言是工程实践性很强的语言,它不是来自某个研究所某个大学学院,而是实实在在从项目需要中产生,伴随着Unix的兴起而流行,语义简明清晰,功能强大而不臃肿,简洁而又不过分简单,实在是居家旅行工作学习必备

  • C语言的语法风格与代码书写规范指南

    C代码: #include <stdio.h> int main(void) { printf("That is Right Style\n"); return 0; } 在一个标准的C语言程序中,最特殊的莫过于main函数了,而说到底它就是一个函数而已,仅仅因为它地位特殊拥有第一执行权力,换句话说,难道因为一个人是省长它就不是人类了?所以函数该有的它都应该有,那么函数还有什么呢? 函数大体上分为内联函数(C99)(内联函数并非C++专属,C语言亦有,具体见前方链接)和非内

  • C语言函数语法详解

    1.概述 在C语言中,函数是来完成子程序或者某个模块的功能.有主程序或者其他函数调用,其他函数之间可以相互调用.同一函数可以被一个或多个函数任意次调用. 注意:     a.一个C程序有一个或多个程序模块组成,每一个程序模块作为一个源程序文件.一个源文件可以为多个C程序共用.     b.程序在编译时是以源文件为单位进行编译,而不是以函数为单位进行编译.一个源文件就是一个编译单元     c.C程序的执行是从main函数开始,也是在main函数中结束整个程序     d.所有函数是平行的,即在定

  • python中的map函数语法详解

    目录 1map()函数的简介以及语法: 2map()函数实例: 1 map()函数的简介以及语法: map是python内置函数,会根据提供的函数对指定的序列做映射. map()函数的格式是: map(function,iterable,...) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合. 把函数依次作用在list中的每一个元素上,得到一个新的list并返回.注意,map不改变原list,而是返回一个新list. 2 map()函数实例: del squa

  • JavaScript  函数语法详解

    目录 一.普通函数 二.箭头函数 三·.数据包 JSON 四.对象Object 五.Promise 六.Async : Await 七.包 总结 一.普通函数 js的函数创建比较特殊,有很多种方式,最简单的一种和c语言类似. 特点: 函数名字可以除了字母.数字.下划线外,还可以存在 "$" 字符. 在js中,函数名就是一个储存函数对象的变量.使用 typeof 关键字可以查看函数类型.(这个理念和python类似,可以用其他变量接手这个函数) 函数形参定义时不需要写关键字:var.le

  • C语言函数指针详解

    目录 Introduction 函数指针 Function Pointers Exercise 1:qsort中的函数指针 Exercise 2: 总结 Introduction 上一个lab的主要内容为__data pointer__(指向数据的指针)可能在Linux系统中造成的__segmentation fault__.本次lab将考虑__function pointer__(指向函数/代码的指针)可能造成的错误:segfault或其他exceptions. 函数指针 Function P

  • C语言中调用Swift函数实例详解

    C语言中调用Swift函数实例详解 在Apple官方的<Using Swift with Cocoa and Objectgive-C>一书中详细地介绍了如何在Objective-C中使用Swift的类以及如何在Swift中使用Objective-C中的类.在后半部分也介绍了如何在Swift中使用C函数,不过对于如何在C语言中使用Swift函数却只字未提.这里我就为大家分享一下如何在C语言中调用Swift函数. 我们首先要知道的是,所有Swift函数都属于闭包.其次,Swift函数的调用约定与

  • C语言ASM汇编内嵌语法详解

    3 GCC Inline ASM GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC Inline ASM--GCC内联汇编.这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写 C/C++代码中使用汇编编写简洁高效的代码. 1.基本内联汇编 GCC中基本的内联汇编非常易懂,我们先来看两个简单的例子: __asm__("movl %esp,%eax"); // 看起来很熟悉吧! 或者是 __asm__(&q

  • C语言类的基本语法详解

    目录 1.由C语言的结构体进入到C++中的类 2.C++中如何定义类? 3.C++中实例化一个对象 4.C++类的访问限定及其封装 C++中的访问限定符 5.C++中类的作用域 6.成员变量和方法在类中是如何存储的? 总结 1.由C语言的结构体进入到C++中的类 我们在C语言中当需要定义多个变量的数据集合时,第一时间会想到使用结构体来进行定义,例如我们定义一个学生变量,包含姓名.年龄.性别等信息,代码示例如下: struct Student{ char name[12]; int age; ch

  • 基于JS脚本语言的基础语法详解

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱类型语言: 开始时要嵌入JS代码:<script type="text/javascript"></script>: 关于写程序是需注意的基本语法: 1.所有的字符全都是英文半角的: 2.大部分情况下每条语句结束后要加分号: 3.每一块代码结束后加换行:4.程序前呼

  • PHP 7.4 新语法之箭头函数实例详解

    短闭包,也叫做箭头函数,是一种用 php 编写的短函数.当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter函数时. 这就是它们看起来的样子: // Post 对象的集合 $posts = [/* - */]; $ids = array_map(fn($post) => $post->id, $posts); 而以前,你必须这样写: $ids = array_map(function ($post) { return $post->id

  • C语言fgetc和fputc函数用法详解(以字符形式读写文件)

    在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块).本节介绍以字符形式读写文件. 以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符.主要使用两个函数,分别是 fgetc() 和 fputc(). 字符读取函数 fgetc fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符.fgetc() 的用法为: int fgetc (FILE *fp); fp 为文件指针.fgetc() 读

随机推荐