国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言函數語法詳解

2020-01-26 15:10:09
字體:
來源:轉載
供稿:網友

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語言的函數語法理解的更深刻了呢,希望大家能夠喜歡本文。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 芦溪县| 高陵县| 施甸县| 旌德县| 凤山市| 镇巴县| 吴旗县| 宜宾县| 霍邱县| 个旧市| 榆社县| 乡城县| 巨野县| 类乌齐县| 芦溪县| 郎溪县| 成安县| 和林格尔县| 宁河县| 景东| 桐梓县| 揭阳市| 承德市| 宝兴县| 阿荣旗| 桂平市| 南江县| 镇赉县| 永胜县| 林芝县| 且末县| 大兴区| 奉贤区| 双辽市| 江西省| 卢龙县| 鄢陵县| 六安市| 古交市| 长宁区| 云浮市|