亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色悠久久久久综合先锋影音下载| 欧美中文在线字幕| 国产亚洲一区二区精品| 国产99视频在线观看| 国产剧情久久久久久| 亚洲欧洲一区二区三区久久| 久久九九全国免费精品观看| www亚洲精品| 尤物九九久久国产精品的分类| 成人两性免费视频| 国产精品jizz在线观看麻豆| 亚洲精品按摩视频| 国产精品激情av在线播放| 欧美精品一区二区三区国产精品| 欧美电影《睫毛膏》| 欧美性生交大片免费| 久久夜精品va视频免费观看| 色偷偷噜噜噜亚洲男人| 亚洲视频专区在线| 国产91色在线免费| 精品日韩视频在线观看| 亚洲精品不卡在线| 国产日本欧美一区二区三区| 国产精品一二区| 亚洲精品日韩在线| 中文字幕成人精品久久不卡| 色婷婷综合成人av| 国产69精品久久久| 国产精品jvid在线观看蜜臀| 国产在线拍揄自揄视频不卡99| 国产日韩欧美电影在线观看| 一区二区亚洲精品国产| 亚洲福利影片在线| 日韩高清免费在线| 最新69国产成人精品视频免费| 日韩国产精品一区| 欧美中文字幕在线| 成人乱色短篇合集| 欧美日韩免费观看中文| 日韩福利视频在线观看| 亚洲欧美在线第一页| 福利一区福利二区微拍刺激| 久久久久久久香蕉网| 91精品在线国产| 亚洲国产高清高潮精品美女| 91综合免费在线| 亚洲精品美女久久久久| 亚洲精品国产电影| 欧美亚洲成人xxx| 欧美日韩在线另类| 国产精品久久99久久| 亚洲自拍偷拍色片视频| 久久久久久久色| 国产z一区二区三区| 亚洲欧美在线磁力| 精品日本美女福利在线观看| 久久6免费高清热精品| 成人午夜在线观看| 中文字幕久久久av一区| 97在线观看视频| 国产精品视频免费在线观看| 日韩电影在线观看永久视频免费网站| 久久久精品中文字幕| 亚洲欧美日韩国产中文| 欧美一乱一性一交一视频| 国产精品美女呻吟| 日韩欧美亚洲一二三区| 欧美巨大黑人极品精男| 国产视频一区在线| 久久久精品久久久| 亚洲一区二区自拍| 欧洲精品久久久| 亚洲欧美激情精品一区二区| 91精品久久久久久久久| 欧美激情网友自拍| 久久精品国产亚洲精品| 九色精品美女在线| 亚洲a级在线播放观看| 成人亚洲激情网| 日韩高清a**址| 国产在线不卡精品| 欧洲成人午夜免费大片| 国产精品美女无圣光视频| 国产精品都在这里| 久久久精品欧美| 亚洲伊人一本大道中文字幕| 国产suv精品一区二区三区88区| 欧美在线视频免费| 色综合色综合网色综合| 日韩视频亚洲视频| 欧美日韩国产黄| 国内精品在线一区| 国产中文字幕91| 亚洲第一av网站| 久久久人成影片一区二区三区观看| 欧美日韩一区二区精品| 亚洲精品大尺度| 精品久久久av| 日韩亚洲欧美中文高清在线| 成人免费福利视频| 欧美在线视频在线播放完整版免费观看| 久热精品视频在线免费观看| 亚洲网站视频福利| 国产精品久久久久久久久久东京| 国产精品亚洲自拍| 国外成人免费在线播放| 亚洲欧洲激情在线| 色噜噜狠狠狠综合曰曰曰88av| 精品伊人久久97| 久久久999国产精品| 91免费看视频.| 亚洲国产精品中文| 91视频九色网站| 久久99精品国产99久久6尤物| 国产精品成人aaaaa网站| 在线激情影院一区| 久久精品国产精品| 亚洲欧美在线免费观看| 主播福利视频一区| 91精品久久久久久久久久入口| 18性欧美xxxⅹ性满足| 91美女片黄在线观看游戏| 九九久久综合网站| 亚洲国产精久久久久久久| 一区二区av在线| 欧洲永久精品大片ww免费漫画| 久久中文字幕一区| 欧美在线观看一区二区三区| 国产日韩在线播放| 精品久久久久久久久久久久久久| 欧美在线观看网站| 亚洲第一页在线| 亚洲欧美国产精品va在线观看| 精品伊人久久97| 91精品久久久久久久久久入口| 一本色道久久综合亚洲精品小说| 欧美做爰性生交视频| 国产成一区二区| 欧美黑人xxxⅹ高潮交| 久久精品国产免费观看| 欧美激情视频播放| 亚洲欧美一区二区三区久久| 久久久欧美一区二区| 日韩在线观看网址| 国产亚洲精品久久久| 97精品国产91久久久久久| 国产有码一区二区| 超碰91人人草人人干| 中文字幕久久久| 欧美性高跟鞋xxxxhd| 国产精品69精品一区二区三区| 日韩中文字幕在线视频播放| 午夜精品视频在线| 欧美在线视频网| 国产成人avxxxxx在线看| 国产成人精品免高潮费视频| 亚洲乱码一区二区| 国产亚洲视频在线| 日本一区二区在线免费播放| 69av在线播放| 日韩在线国产精品| 91精品中文在线| 国产视频精品在线| 亚洲人成绝费网站色www|