一、定義跟初始化的區別
聲明:可理解爲預先告訴編譯器實體的存在,但我們不知道它存在的位置。
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聲明