卧龙小说网> > > 2.5.2节练习

2.5.2节练习

2.5.2节练习

2.5.2节练习

练习2.33:利用本节定义的变量,判断下列语句的运行结果。

a = 42; b = 42; c = 42;

d = 42; e = 42; g = 42;

出题思路:

本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。首先,使用引用其实是使用引用的对象,所以当引用被用作初始值时,真正参与初始化的其实是引用对象的值,编译器以引用对象的类型作为auto的推类型。其次,auto一般会忽略掉顶层const,同时保留底层const。

解答:

前3条赋值是合法的,原因如下:

r是i的别名,而i是一个整数,所以a的类型推断结果是一个整数;ci是一个整型常量,在类型推断时顶层const被忽略掉了,所以b是一个整数;cr是ci的别名,而ci是一个整型常量,所以c的类型推断结果是一个整数。因为a、b、c都是整数,所以为其赋值42是合法的。

后3条赋值语句是非法的,原因如下:

i是一个整数,&i是i的地址,所以d的类型推断结果是一个整型指针;ci是一个整型常量,&ci是一个整型常量的地址,所以e的类型推断结果是一个指向整型常量的指针;ci是一个整型常量,所以g的类型推断结果是一个整型常量引用。因为d和e都是指针,所以不能直接用字面值常量为其赋值;g绑定到了整型常量,所以不能修改它的值。

练习2.34:基于上一个练习中的变量和语句编写一段程序,输出赋值前后变量的内容,你刚才的推断正确吗?如果不对,请反复研读本节的示例直到你明白错在何处为止。

出题思路:本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。

解答:

基于上一个练习中的变量和语句编写的程序如下所示:

#include <iostream>

int main()

{

int i = 0 &r = i;

auto a = r; // a是一个整数(r是i的别名,而i是个整数)

const int ci = i &cr = ci;

auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)

auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)

auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)

auto e = &ci; // e是一个指向整型常量的指针(对常量对象取地址是一种底层const)

auto &g = ci; // g是一个整型常量引用,绑定到ci

std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << g << std::endl;

a = 42;

b = 42;

c = 42;

d = 42; // 错误:d是一个指针,赋值非法

e = 42; // 错误:e是一个指针,赋值非法

g = 42; // 错误:g是一个常量引用,赋值非法

std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << g << std::endl;

return 0;

}

程序的输出结果是:

0 0 0 0x28fedc 0x28fed8 0

42 42 42 0x28fedc 0x28fed8 0

练习2.35:判断下列定义推断出的类型是什么,然后编写程序进行验证。

const int i = 42;

auto j = i; const auto &k = i; auto *p = &i;

const auto j2 = i &k2 = i;

出题思路:本题旨在考查auto说明符与复合类型、常量混合使用时的各种情形。

解答:由题意可知,i是一个整型常量,j的类型推断结果是整数,k的类型推断结果是整型常量,p的类型推断结果是指向整型常量的指针,j2的类型推断结果是整数,k2的类型推断结果是整数。

用于验证的程序是:

#include <iostream>

$include <typeinfo>

int main()

{

const int i = 42;

auto j = i;

const auto &k = i;

auto *p = &i;

const auto j2 = i &k = i;

atd::cout << typeid(i).name() << std::endl;

atd::cout << typeid(j).name() << std::endl;

atd::cout << typeid(k).name() << std::endl;

atd::cout << typeid(p).name() << std::endl;

atd::cout << typeid(j2).name() << std::endl;

atd::cout << typeid(k2).name() << std::endl;

return 0;

}


普通的冒险故事提示您:看后求收藏(卧龙小说网http://www.wolongxs.com),接着再看更方便。

好书推荐:《我的剧本世界在自主运行》《我是舰娘》《我的师妹是妖女》《交错世界之学院都市》《认清现实后,她们开始追夫火葬场》《好徒儿你就饶了为师伐》

目录