/*窃以为好的程序能在各种编译器中运行,故代码编写者需慎重,并了解某些真相!*/
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输出后,会换行!又是编译器的原因!】