例题
知识点
一、
类型说明符随后紧跟由一个或多个变量名组成的列表,其中变量名以逗号分隔,最好以分号结束。列表中每个1变量名的类型都有类型说明符指定,定义时还可以为一个或多个变量赋初值。
二、
对象是指一块能储存数据并具有某种类型的内存空间;把命名了的对象叫做变量;对象指能被程序修改的数据,而值指只读的数据。
三、
初始化和赋值是两个完全不同的操作。初始化的含义是创建变量时赋予其一个初始值;而赋值的含义是把对象的当前值擦除,而以一个新值来代替。
四、
使用花括号来初始化变量的形式被称为列表初始化,如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。
五、
如果定义变量时没有指定初始值,则变量默认初始化。定义与任何函数体之外的变量被初始化为0;定义在函数体内部的内置类型变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将引发错误。
六、
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量。我们能给extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用。
七、
在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。
八、
变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝对不能重复定义。
九、
C++的标识符由字母、数字和下划线组成,其中必须以字母或下划线开头。标识符的长度没有限制,但是对大小写字母敏感。用户自定义的标识符中不能连续出现两个下划线,也不能以下划线紧连大写字母开头。此外,定义在函数体外的标识符不能以下划线开头。
十、
作用域是程序的一部分,在其中名字有其特定的含义。
名字main定义于所有花括号之外,它和其他大多数定义在函数体之外的名字一样拥有全局作用域 。从声明变量开始到该变量所在函数结束为止都可以访问它,此变量拥有块作用域 。
十一、
作用域能彼此包含,被包含(或者说被嵌套)的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域。
十二、
允许在内层作用域中重新定义外层作用域已有的名字,此时应该注意变量的有效范围。
练习题
2.2.1节练习
练习2.9:
解释下列定义的含义。对于非法的定义,请说明错在何处并将其改正。
(a)std::cin >> int input_value;
(b)int i = { 3.14 };
(c)double salary = wage = 9999.99;
(d)int i = 3.14;
(a)std::cin >> int input_value; 非法,输入运算符的右侧对象不合法 (b)int i = { 3.14 }; 非法,使用double类型的值初始化int变量时可能丢失数据,所以编译器拒绝了此类初始化请求 (c)double salary = wage
= 9999.99; 非法,在类型说明符后紧跟的多个变量名组成的列表需要使用逗号分隔。 (d)int i = 3.14; 合法,把3.14成功转化为3,并赋值给i
练习2.10:
下列变量的初值分别是什么?
std::string global_str;
int global_int;
int main()
{
int local_int;
std::string local_str;
}
std::string global_str; // 初始化为空字符串
int global_int; // 初始化为0
int main()
{
int local_int; // 不被初始化
std::string local_str; // 不被初始化
}
2.2.2节练习
练习2.11:
指出下面的语句是声明还是定义:
(a)extern int ix = 1024;
(b)int iy;
(C)extern int iz;
(a)extern int ix = 1024;
声明并且定义,因为赋值操作抵消了extern的作用。
(b)int iy;
声明并且定义
(C)extern int iz;
声明而非定义。
2.2.3节练习
练习2.12:请指出下面的名字中哪些是非法的?
(a)int double = 3.14;
(b)int _;
(c)int catch-22;
(d)int 1_or_2 = 1;
(e)double Double = 3.14;
(a)int double = 3.14;
合法
(b)int _;
合法
(c)int catch-22;
非法,C++的标识符由字母、数字和下划线组成,没有减号。
(d)int 1_or_2 = 1;
非法,C++的标识符必须以字母或下划线开头,数字不能作为开头。
(e)double Double = 3.14;
合法
2.2.4节练习
练习2.13:
下面程序中j的值是多少?
int i = 42;
int main()
{
int i = 100;
int j = i;
}
j=100,局部变量i定义之后,此时局部变量i正在作用域内,因此j的值用的是局部变量i。
练习2.14:
下面的程序合法吗?如果合法,它将输出什么?
int i = 100, sum = 0;
for (int i = 0; i != 10; ++i)
sum += i;
std::cout << i << " " << sum << std::endl;
输出时的i为第一次定义的i=100,在循环程序中的i为循环定义时的i=0。