(12)'c++:COMPLETE REFERENCE' 第一部分 第二章(表达式) 第四节

来源:互联网 发布:网络推手收费 编辑:程序博客网 时间:2024/05/16 11:53

 变量

      变量就是一个被命名的内存地址,这个地址用来存储可被程序修改的数值。所有的变量在使用前必须首先被声明。通常的声明格式是:
type variable_list;
数据类型 变量名,[变量名]...;

      type必须是一个有效的数据类型加上任何合理的修饰符,voriable_list就是一个或者多个变量名称,中间用逗号分开,以分号结尾。以下是一些例子:

int i,j,l;
short int si;
unsigned int ui;
double balance,profit,loss;

      记住,在c语言和c++中,变量的名称对它的类型没有任何决定作用。

变量应该在什么地方被声明?

      变量会在三个地方被声明:在函数体中,在定义函数的形式参数时,在所有函数的外部。这三种在不同位置声明的变量分别是本地变量(临时变量)、形式参数、全局变量。

本地变量(临时变量)

      在函数体内定义的变量被称为本地变量,某些c语言或者c++的文献把这种变量称为“automatic variables”。本书采用最常用的术语,也就是“本地变量(local variables)”。本地变量只能在声明该变量的代码块的语句中被使用,换句话说,本地变量不可以在它自己所属的代码块之外被使用。代码块是指由花括号所包含的语句序列。本地变量也被称为临时变量,因为它只在声明它的代码块被执行时存在,也就是说在该代码块的执行入口处本地变量才被创建,当代码块执行结束时本地变量被销毁。本地变量最常在函数中被声明。例如,如下的两个函数:

void func1( void )
{
    int x;
    x = 10;
}

void func2( void )
{
    int x;
    x = -199;
}

      整型变量x被声明了两次,一次在func1,一次在func2。这两个变量互相没有影响也不存在任何联系。因为它们都仅仅在自己的代码块中有效,对于另外的代码块也就是说对于另外的函数来说它们不可见。

      c语言中有一个关键字auto,你可以用它来定义本地变量。不过因为任何非全局变量都被假定为本地变量,因此auto这个关键字实际上很少使用。因此,本书的例子中不会使用这个关键字。(c语言之所以提供auto这个关键字是为了和它的前身B语言保持兼容,同样,c++也是为了能和C语言兼容所以也继续支持关键字auto。)为了方便和习惯,大部分程序员在函数的一开始就首先声明所有的变量,然后才开始书写其它语句。可以在任何代码块中声明本地变量,而不仅仅是在函数中,函数也只是代码块的一个特殊情况。比如:


void f( void )
{
    int t;

    scanf( "%d%*c", &t);

    if( t == 1 )
    {
        char s[80];       /* this is created only upon entry into this block */
        printf( "Enter name:" )
        gets( s );
        /* do something ... */
    }
}


      这里,本地变量 s 将在if代码块开始的时候创建,在其结束的时候销毁。并且,s仅仅在if语句代码块中有效,在其它任何地方,甚至包含if代码块的函数中也是不可见的。在代码块中声明本地变量可以帮助我们防止预料之外的副作用产生。因为本地变量在代码块之外是不可见的,于是就避免了程序的其它地方意外的修改变量的值。

      c语言和c++有一个很重要的区别,那就是它们对声明变量的位置有不同的规定。在c语言中,必须在代码块的一开始声明本地变量,声明必须在任何功能语句之前。比如,在C89标准下,下面的函数就是错误的。

/* For c89, this function is in error, but it is perfectly acceptable for c++. */
void f( void )
{
    int i;
    i = 10;
    int j; /* this line will caunse an error. */
    j = 20;
}

      然而,在c++中这个函数是绝对正确有效的,因为c++允许在代码块的任何地方声明变量。因为本地变量都是在代码块的入口被创建,在结束时被销毁,因此当一个代码块结束以后,本地变量的内容就丢失了。这点必须被牢记,尤其是在调用函数的时候,我们必须清楚函数的本地变量无法返回它们的值,因为它们在函数调用结束时就被销毁了。(尽管我们可以通过使用static修饰符来使得编译器保留变量的值。)

      除非另行定义,否则本地变量将会被保存在stack(栈)中。栈是一种动态分配的内存区域,这也就是为什么函数调用之后本地变量的值不能被保留。你可以给本地变量赋于一个已知的数值,这样当每一次该本地变量所在的代码块开始的时候,变量会被赋于该值。下面的程序将会把“10”打印10次。

#include <stdio.h>

void f( void )
{
    int i;
    for( i = 0; i < 10; i++ ) f();
    return 0;
}

void f( void )
{
    int j = 10;
    printf( "%d", j );
    j++;    /* this line has no lasting effect */
}

形式参数

      如果一个函数将会用到实参,那么首先需要声明可以接受这种实参的变量,称为形式参数。它们的作用和其它在函数体内声明的本地变量是一样的。以下的程序片断中,形式参数在函数名后的圆括号内被声明:
/* Return 1 if c is part of string s; 0 otherwise */
int is_in( char *s, char c )
{
    while( *s )
        if( *s == c ) return 1;
        else s++;
    return 0;
}


      函数is_in有两个参数,s和c。函数将在s字符串中包含c中的值时返回1,否则返回0。形式参数数据类型的指定,就像上面的例子中一样,是在形式参数的声明过程中完成的,而形参的声明是在函数名后的圆括号中。随后,可以在函数体中的任何地方像使用本地变量一样使用这些参数。要始终记住,这些形式参数也和本地变量一样,在函数开始的时候被创建,在函数结束的时候被清除。和本地变量一样,形式参数可以被赋值,可以被用于表达式当中。尽管它们从传递给函数的实参中接收了值,你仍然可以像使用其它本地变量那样使用它们。

全局变量

      与本地变量不同,全局变量在整个程序生命周期中都是可见的,可以在程序的任何地方被使用。它的值将在整个程序运行期间始终保留。在所有函数之外声明的变量就是全局变量。任何代码块中的表达式都可以访问这些全局变量。在下面的程序中,count变量在所有函数之外被声明,尽管本书中它是在main()函数之前被声明的,实际上可以把它放在任何地方,唯一的要求是它必须在第一次使用它之前被声明。不过,通常全局变量还是在整个程序的最顶端声明为好。

#include <stdio.h>
int count;      /* count is global */

void func1( void );

void func2( void );

int main( void )
{
    count = 100;
    func1();

    return 0;
}

void func1( void )
{
    int temp;
    temp = count;
    func2();
    printf( "count is %d", count );   /* will print 100 */
}

void func2( void )
{
    int count;
    for( count = 1; count < 10; count++ )
        putchar( '.' );
}

      仔细看这个程序,尽管函数main()和函数func1()都没有声明变量count,但是因为count被声明为全局变量,因此它们仍然可以使用count变量。而函数func2()中声明了一个与count同名的本地变量,当func2函数中用到变量count的时候,它实际上使用的是它自己声明的本地变量count,而并不是那个全局变量count。也就是说,当一个全局变量和一个本地变量有同样的名称时,在声明该本地变量的代码块中使用该变量名将会访问本地变量而对全局变量不产生影响。这给我们带来了许多方便,但是如果忘记这些规则将会让程序出现逻辑问题,尽管代码看起来是合法的。

      编译器将会在内存中划分固定的专用区域存储全局变量。当程序中的多个函数需要使用同一个数据的时候,全局变量非常有用。但是我们也应该避免在不必要的时候使用全局变量,因为全局变量将会在整个程序运行期间占用固定的内存。另外在本来可以使用本地变量的时候使用全局变量也会降低函数的通用性,因为它们不得不与在函数外定义的一些东西相关联。总之,过度的使用全局变量常常会导致程序出错,这是因为有许多未知的预料之外的副作用会发生。开发大型程序时的主要的问题就是意外的改变变量的值,尤其是当它们在程序的其它地方也被使用的时候。当用c语言或者c++开发程序时,过多的使用全局变量就会导致这种问题的发生。

原创粉丝点击