關於變量未賦值——被忽視的C語言點滴

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

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