關於函數調用涉及到的知識點的歸納

一、定義跟初始化的區別

聲明:可理解爲預先告訴編譯器實體的存在,但我們不知道它存在的位置。

  char  a;

定義:可理解爲明確指示編譯器實體的意義,有確切的空間地址

  char  a=5;

二、程序中的順序點

順序節點:指的程序語句執行過程中修改變量值的最晚時刻;

順序點有:

1.每個完整表達式結束時;

2.&&,||,?,:以及逗號表達式的每個運算對象計算之後

3,,函數調用中對所有實際參數的求值完成之後(進入函數體之前)

三、函數的缺省認定

C語言會默認沒有函數類型的函數參數爲int 

f(i,j)

  {

   }

等價於

int  f(int  i,int   j)

{

}



經典例子:

int   f(int i,j)

{

   printf("%d,%d\n",i,j);

}

int  main

{

     int  k=1;

     f(k,k++);

     printf("%d\n",k);

     return   0;

}




最後輸出結果爲  2,1,2

函數的調用依賴於編譯器,以順序點來分析:

上面函數執行f(k,k++);的步驟我們可分解爲:

第一步:.還沒到順序點時:i、j都爲1;

第二步:當遇到順序符“ ;”時,由於k的值已經爲2,

所以返回值i=2;由於運行k++時,k的值存在記錄表

的臨時變量域中,所以k的值爲1;


四、可變的參數列表

1、C語言中可以定義參數可變的函數

2、可變的參數列表涉及到stdarg.h、

va_list、va_start、va_end、va_arg

例子:

#include <stdio.h>
#include <stdarg.h>


float average(int n, ...)
{
    va_list args;
    int i = 0;
    float sum = 0;
    
    va_start(args, n);
    
    for(i=0; i<n; i++)
    {
        sum += va_arg(args, int);
    }
    
    va_end(args);
    
    return sum / n;
}


int main()
{
    printf("%f\n", average(5, 1, 2, 3, 4, 5));
    printf("%f\n", average(4, 1, 2, 3, 4));
    
    return 0;
}

五、函數設計的技巧

1.儘量不要在函數中使用全局變量

2.參數名要能夠體現參數的意義

3,如果參數是指針,且僅作輸入參數用,則應在類型前加const,以防止該指針在函數體內意外修改

4.不要省略返回值類型,沒有返回值時,要用void聲明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章