6 第三章数据类型、标识符和关健字 为在实际问题中对于其上下文的含义是不正确的.下面是本程序显示的信息 ERROR:Too many types in declaration 这是因为1oat是一个关键字,不能用来作为标识符或保留字的名字.这一问题可 通过把f1oat改成不是关键字或保留字的名字,象varl这样的就可以,下面是 text3.l.cpp的重写: //TEXT3-1.CPP /iostream.h对于cout是必需的 #include iostream.h main0 int varl;/合法的标识符名字 int sum;//合法的标识符名 int Sum;/合法的标识符名字 var1-2; Sum=0; sum-5; Sum-sum+var1; cout"Sum is“<Sum"n' 编译并执行上述代码得到正确输出结果: Sum is 7 3.10保留的关键字 下列单词不能用来作为标识符,因为它们仅为C+编译器保留使用: asm default aot new switch delete for operator template breal do friend overload this case double goto private typedef catch else if protected union char enum public unsigned class extern int register virtual const long return volatile continue short sizeof static struct
第三章数据类型、标识符和关健子 27 3.11小结 本章我们学会了如何声明基本数据类型,并且简短地介绍了这些数据类型在计算机中 如何存储。表3.3总结了这些数据类型在16位计算机上的存储需求和数值范围.请记住 存储规定会因不同的计算机而异。如果在一台IBM或IBM兼容PC机上工作,那么存储规 定将与此大致相同 表3·3数据类型及存储需求 数据类型 在C4+中声明 存储 允许值 整数 16位 -32,768至 +32.767 短整数 short int 6位 -32,768至 +32,767 长整数 long int 32位 -2,147,483,648 2,147,483,647 无符号整数 unsigned int 16位 0至65,535 长整教常量 如后缀或U 32位 -2.147,483,648 2,147,483,64 无符号整形常量 加后缓u或U 16位 0至65,S35 字符型 8位 ASCII码 浮点型 10 至3.410 双精度 ouble 6位 1.710m 至1.7X10 双精度长型 后蝦1或1 80位 3.410 至1.1X10
28 第四章存储分类符和作用域 第四章存储分类符和作用域 4.1简介 上一章我们学会了C+中的不同数据类型.在本章里,我们将讨论这些数据类型的 存储分类符(storage classes). ■存储分类符定义了变量在内存中的位置以及程序执行过程中变量的作用时间即生命周 期 与存储分类符紧密相关的是作用域(scope). ■作用域是指程序中变量能够活动(active)的程序段.在此程序段中,变量可被存 取. ■变量的存储分类符可以通过声明来显式地(explicitly)定义,也可以通过上下文隐 式地(implicitly)定义. 缺省时,存储分类符通过上下文声明,下面是C+的存储分类符: static external regisiter ■存储分类符可以缺省. 如果一个变量的存储分类符未声明就意味着编译器认为它是通过上下文来声明的缺省 的存储分类符。本章后面几节将详细讲述各种存储分类符 4.2自动变量声明 ●关键字o用来声明自动变量.被声羽的变量可以省略标识符心0,清看下列代 auto int a;/自动变量 char b;/自动变量(缺省形式》 ■C+中,自动变量的作用域(变量的值在程序内部的活动范围)仅仅是该变量所在的 程序块或该程序块内部的程序块。 下面是说明自动变量的作用域的例子: //test4-1.cpp #include <iostream.h> main() i和j是缺省的自动变量 inti int j;
第四章存储分类符和作用城 9 cout<"i in outer block is'<i<"n" cout<<"j in outer block is'<<j<<"\n"; cout<k in outer block is"<k< 【/内部的程序块 intk/缺省的自动变量 cout<<i in inner block is"i cout<<"j in inner block is"<<j<<"\n" cout<<"k in inner block is'<<k<<"\n"; 1 /外部的程序块 cout<<"i back in outer block is"<i<<"n" cout<<j back in outer block is"<<j<n cout<k back in outer block is"<k<<"n" )】/∥main()结束 编译这个程序会得到如下错误信息, Error:Undefined symbol 'k'in function main() Error:Undefined symbolk in function main() 这是因为变量k缺省为自动变量,它在内部的程序块中声明,所以只能在内部的程 序块中存在或存取。在外部的程序块中,编译器不知道k的值(在外部的程序块中,超 出了k的作用域)。因此产生了错误信息。这个错误很容易改正,只要别除在内部的程序 块中对k的声明,而在外部的程序块中声明k即可.修改之后,重新编译运行该程序会 得到如下输出结果 i in outer block is 8886 j in outer block is 18 k in outer block is 0 i in inner block is 8886 j in inner block is 18 k in inner block is i back in outer block is 8886 j back in outer block is 18 k back in outer block is 0
第四章存储分类符和作用域 出现在变量1、i、k中的值8886、18、0都是从哪里来的呢?在C+中,自动变量 如果没在它本身的作用域内初始化,那么该变量就可能包含随机的无用的信息值。假设变 量1,j、k的初始声明修改如下: int i=1: int j=2; int k-3 这时输出会变为 i in outer block is 1 j in outer block is 2 k in outer block is 3 i in inner block is 1 jin inner block is 2 k in inner block is 3 i back in outer block is 1 jback in outer block is 2 k back in outer block is3 4.3静态变量声明 ■可在变量声明语句前面加上关键字static来表示静态变量. 静态变量象自动变量一样,也是局部变量.只在它所处的函数、程序块或子程序块内 部有效,然而与自动变量有一个重大区别: 当静态变量离开作用域时,它的值仍然保持不变或者说它具有有粘性 当程序又回到静态变量所在的函数时,程序处理的是上一次存储在静态变量中的值。 ■ 静态变量在没有明确的初始值时,会自动初始化为0或空(ULL)。 请看下面的程序 //test4-2.cpp ¥include<iostream h> /下面是函数原型 void sum(void);