2.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)是错误的,输入运算符的右侧需要一个明确的变量名称,而非定义变量的话句,改正后的结果是:int input_value; std::cin >> input_value;
(b)引发警告,该语句定义了一个整型变量i,但是试图通过列表初始化的方式把浮点数3.14赋值给i,这样做将造成小数部分丢失,是一种不被建议的窄化操作。
(c)是错误的,该语句试图将9999.99分别赋值给salary和wage,但是在声明语句中声明多个变时需要用逗号将变量名隔开,而不能直接用赋值运算符连接,改成后的结果是:double salary, wage; salary = wage = 9999.99;
(d)引发警告,该语句定义了一个整型变量i,但是试图把浮点数3.14赋值给i,这样做将造成小数部分丢失,与(b)一样是不被建议的窄化操作。
练习10:下面变量的初值分别是什么?
std::string global_str;
int global_int;
int main()
{
int local_int;
std::string local_str;
}
【解答】
对于string类型的变量来说,因为string类型本身接受无参数的初始化方式,所以不论变量定义在函数内还是函数外都被默认初始化为空串。
对于内置类型int来说,变量glogal_int定义在所有函数体之外,根据C++的规定,global_int默认初始化为0;而变量local_int定义在main函数的内部,将不被初始化,如果程序试图拷贝或输出未初始化的变量,将遇到一个未定义的奇异值。
#include <iostream>
//该程序仅用于说明:函数内部不宜定义与全局变量同名的新变量
int reused = 42; //reused 拥有全局作用域
int main()
{
int unique = 0;
std::cout << reused << " " << unique << std::endl;
int reused = 0;
std::cout << reused << " " << unique << std::endl;
std::cout << ::reused << " " << unique << std::endl;
return 0;
}
练习11:指出下面的语句是声明还是定义:
(a) extern int ix = 1024;
(b) int iy;
(c) extern int iz;
【解答】
声明与定义的关系是:声明使用得名字为程序所知,而定义负责创建与名字关联的实体。
(a)定义了变量ix,(b)声明并定义了变量iy,(c) 声明了变量 iz;
练习12:请指出下面的名字哪个是非法的?
(a) int double = 3.14; (b) int _;
(c) int catch-22; (d) int 1_or_2 = 1;
(e) double Double = 3.14;
【解答】
(a)是非法的,因为double是C++关键字,代表一种数据类型,不能作为变量的名字。
(c)是非法的,在标识符中只能出现字母、数字和下画线,不能出现符号-,如果改成"int catch_22;"就是合法的了。
(d)是非法的,因为标识符必须以字母或下画线开头,不能以数字开头
(b)和(e)是合法的命名;
练习13:下面程序中j的值是多少?
#include <iostream>
int i = 42;
int main()
{
int i = 100;
int j = i;
std::cout << "j===============================" << j;
return 0;
}
【解答】
j的值是100。C++允许内层作用域重新定义外层作用域中已有的名字,在本题中,int i = 42;位于外层作用域,但是变量i在内层作用域被重新定义了,因此真正赋予j的值是定义在内层作用域中的i的值,即100。程序运行结果如下:
练习14:下面的程序合法吗?如果合法,它将输出什么?
#include <iostream>
int main()
{
int i = 100, sum = 0;
for(int i = 0; i != 10; ++i)
{
sum += i;
}
std::cout << "i========" << i << " " << "sum=======" << sum << std::endl;
return 0;
}
【解答】
该程序存在嵌套的作用域,其中for循环之外是外层作用域,for循环内部是内层作用域。首先在外层作用域中定义了i和sum,但是在for循环内部i被重新定义了,因此for循环实际上是从i=0循环到了i=9,内层作用域中没有重新定义sum,因此sum的初始值是0并在此基础上依次累加。最后一句输出语句位于外层作用域中,此时在for循环内部重新定义的i已经失效,因此实际输出的仍然是外层作用域中,此时在for循环内部重新定义的i已经失效,因此实际输出的仍然是外层作用域的i,值为100;而sum经由循环累加,值变为了45。
该程序是合法的,下面输出结果。