《C++ Primer》第2章 2.2节习题答案

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。

该程序是合法的,下面输出结果。

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值