/*竊以為好的程式能在各種編譯器中運行,故代碼編寫者需謹慎,並瞭解某些真相!*/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輸出後,會換行!又是編譯器的原因!】