关于变量未赋值——被忽视的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输出后,会换行!又是编译器的原因!】

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