C语言变量的定义位置以及初始值 此为收费教程,尊重作者的原创,请到http://c.biancheng.net/cpp/u/jiaocheng/,缴费学习,我这边隐藏文章内容,供自己学习之用。

在C语言中,变量可以定义在函数外面,也可以定义在函数里面,请看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
//在函数外部定义变量
int n = 100;
char c = '@';
int main(){
    //在函数内部定义变量
    float f = 89.5;
    char *str = "http://c.biancheng.net";
    //输出变量
    printf("n: %d\nc: %c\nf: %f\nstr: %s\n", n, c, f, str);
    return 0;
}

运行结果:
n: 100
c: @
f: 89.500000
str: http://c.biancheng.net

我们在 main() 函数外部定义了变量 n 和 c,在函数内部定义了变量 f 和 str,它们都可以通过 printf() 输出。也就是说,在函数外部定义的变量在函数内部也可以使用。

在函数外部定义的变量叫做全局变量(Global Variable),在函数内部定义的变量叫做局部变量(Local Variable),它们的区别将会在《C语言函数》一章中详细说明。这里大家只要明白,变量也可以在 main() 函数外面定义即可。
微软编译器和GCC的区别

VC和VS都使用微软的编译器cl.exe。微软编译器规定,变量要在函数开头定义。也就是说,在定义变量之前不能有其他代码。例如,下面的例子就是错误的:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
int main(){
    int a = 100, b = 200, c;
    c = a + b;
    float d = 23.5, e = 22.899, f;
    f = d + e;
    //输出变量
    printf("c = %d, f = %f\n", c, f);
    system("pause");
    return 0;
}

在定义变量 d、e、f 之前,有语句c = a + b;,这是错误的。更正后的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h> 
int main(){
    int a = 100, b = 200, c;
    float d = 23.5, e = 22.899, f;
    c = a + b;
    f = d + e;
    //输出变量
    printf("c = %d, f = %f\n", c, f);
    system("pause");
    return 0;
}

应当将变量 d、e、f 的定义移到语句c = a + b;之前。

而GCC编译器(C-Free、Dev C++、Code::Blocks 默认都使用GCC编译器)没有这个限制,变量可以在函数的任意位置定义,所以上面两段代码在GCC下都能够通过编译。

为什么相同的代码在不同的编译器下会产生不同的结果呢?这是因为它们遵循的标准不一样,我们会在下节《C语言的两套标准》中为您解开谜团。
变量的默认初始值

一个变量,即使不给它赋值,它也会有一个默认的初始值。因为每个变量都会占用一段内存空间,它的值就是这段内存中的数据。请看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h> 
int a1;
float b1;
char c1;
int main(){
    int a2;
    float b2;
    char c2;
    printf("a1 = %d, b1 = %f, c1 = %d\n", a1, b1, c1);
    printf("a2 = %d, b2 = %f, c2 = %d\n", a2, b2, c2);
    system("pause");
    return 0;
}

可能的运行结果:
a1 = 0, b1 = 0.000000, c1 = 0
a2 = 17969204, b2 = 23.453390, c2 = 113

可以发现,全局变量的默认初始值是 0(它所占用的每一个字节都是0值),局部变量的默认初始值是随机的,是垃圾值,没有规律。这就告诫我们,使用局部变量之前一定要初始化,否则它的值是没有意义的。

» 订阅本站: http://www.0523jz.com/feed