从头学C(15)声明

0

有位哲人曾经说过:所有变量都必须先声明、后使用!如果你不这么做,编译器一定会报你的错~~

第二章 类型、运算符与表达式 >> 2.4 声明

一个声明指定一种类型,所以同一类型的多个变量是可以放在一起进行声明的,比如:

int lower, upper, step;
char c, line[100];

当然,也可以拆开单独声明,比如:

int lower;
int upper;
int step;
char c;
char line[100];

这样做的好处是方便给每个变量后面添加注释,便于以后修改。

变量的初始化

声明的同时可以对变量进行初始化,比如:

char esc = '\\';
int i = 0, j, k;
int limit = MAXLINE + 1;
float eps = 1.0e-5;

通过一个等于号“=”的赋值表达式,就完成了变量的初始化。

如果变量不是自动变量(比如外部变量等),则只能进行一次初始化,从概念上讲,应该是在程序开始执行之前进行,并且初始化表达式必须为常量表达式。(我的理解是:通常程序开始执行是以main函数为入口,而作为外部变量,是在main函数外面进行声明的,而此时如果要对此外部变量进行初始化操作,由于没有进入main函数,变量表达式的值是不确定的,因此只能用常量表达式对该外部变量进行初始化。显然,这个初始化的操作是在进入main函数之前就完成了。)

默认情况下,外部变量和静态变量(static类型)都将被初始化为0,而没有经过显式初始化的自动变量,其值是未定义值(即无效值),注意不是0!!!

const修饰符

任何变量都可以使用关键字const来修饰,该修饰符指定变量的值不能被修改。对数组而言,const指定数组所有元素的值都不能被修改。

const double e = 2.71828182845905;
const char msg[] = "warning: ";

关于const的作用,以下内容来自百度:

  1. 可以定义const常量,具有不可变性。 例如:
    const int Max = 100;
    
    Max++; /* 会产生错误 */
  2. 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患,例如:
    void f(const int i)  /* 编译器就会知道i是一个常量,不允许修改 */
    {
            声明部分
    
            语句部分
    }
  3. 可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!如1.中如果想修改Max的内容,只需要:const int Max=your_value;即可!
  4. 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错:
    void f(const int i) 
    {
            声明部分
    
            i = 10;       /* 编译器会报错 */
            语句部分
    }
  5. 可以节省空间,避免不必要的内存分配。 因为const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。 例如:
    #define PI 3.14159 //常量宏 
    const double Pi=3.14159; //此时并未将Pi放入RAM中 ...... 
    double i=Pi; //此时为Pi分配内存,以后不再分配! 
    double I=PI; //编译期间进行宏替换,分配内存 
    double j=Pi; //没有内存分配(因为第三行已经分配过了)
    double J=PI; //再进行宏替换,又一次分配内存!
  6. 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

但是不能把const修饰的变量简单的认为是一个常量,不然会出现意想不到的错误,关于其详细用法和注意事项,此处就不一一罗列。

Leave A Reply