/*竊以爲好的程序能在各種編譯器中運行,故代碼編寫者需慎重,並瞭解某些真相!*/
int main()
{
int a=42;
printf("%d\n",a);
}
上面的小程序有什麼問題呢?你能想起幾條來呢?加上以下幾點纔是接近“正確的”的C程序。
1.#include<stdio.h>
2.return 0;
程序運行的結果是:在屏幕上打印42,並換行。
其實,上述兩條修改之外,還可以有所改進的-----3. int main(void)
再看下面的小程序:
#include<stdio.h>
void fun(void)
{
int a=3; /*改爲 static int a=3; 如何呢?*/
++a;
printf("%d\n",a);
}
int main(void)
{
fun();
fun();
fun();
return 0;
}
輸出結果是:4 (換行)4(換行) 4(換行)
01.若是將程序按照註釋部分修改的話,結果又如何呢?結果:4 (換行)5(換行) 6(換行)
02.若是將上述程序再做修改,仍修改註釋的那語句,改爲static int a ;結果如何呢?提示錯誤嗎?或是給出三個“垃圾數”?
都不是!結果是:1 (換行)2(換行) 3(換行)
原因:static變量在未賦值時,會默認初始值爲0!此與編譯器無關。
問:auto變量也會在未賦值的情況下,默認初始值爲0?No!但是你得到的結果是有可能是1 (換行)2(換行) 3(換行),這可能是你的編譯器的造成的,換個編譯器試試。
再問:爲什麼C語言要區別對待auto與static? 答:C語言是重視效率的語言,若對auto也默認賦初值0,會增加函數調用的時間花費。
03. 若是將註釋的語句改爲int a; 並將移至函數體外,即定義爲全局變量,結果會是?答:1 (換行)2(換行) 3(換行)【也就是說定義爲全局變量時,static int a;與int a在此情況下的結果是一樣的】
再看下一個程序:
#include<stdio.h>
void fun(void)
{ int a;
printf("%d\n",a);
}
void bar(void)
{int a=42;}
int main(void)
{
bar();
fun();
return 0;
}
在VC 6.0中,得出的結果是一個“垃圾數”,但在gcc得出的結果是 42.【這不是我們想要寫出的代碼,儘量避免!】
下一個程序:
#include<stdio.h>
int b(void) {puts("3"); return 3;}
int c(void) {puts("4"); return 4;}
int main(void)
{
int a=b()+c();
printf("a=%d\n",a)
return 0;
}
運行的結果:3(換行)4(換行)7(換行) 或者 4 (換行)3(換行)7(換行)【puts輸出後,會換行!又是編譯器的原因!】