C++ Primer 学习之路-第二章-变量和基本类型(2.1-2.2)

C++ Primer 学习之路-第二章-变量和基本类型(2.1-2.2)

2.1 基本内置类型

表2.1:C++:算术类型

类型含义最小尺寸
bool(取值为true或false)布尔类型未定义
char字符8位
wchar_t宽字符16位
char16_tUnicode字符16位
char32_tUnicode字符32位
short短整型16位
int整形16位
long长整形32位
long long长整形64位
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double拓展精度浮点数10位有效数字

除bool型和拓展的字符型之外,其他整型都可分为 有符号(signed)无符号(unsigned) 两种。

习题2.1:
类型int、long、long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?
答:
int、long、long long和short均为整形,但各个类型的最小尺寸不同,short和int为16位,long为32位,long long为64位。
无符号类型只能表示大于等于0的数,有符号类型可以表示正数、负数和0。
float位单精度浮点数,double位双精度浮点数;float占4个字节,有效数字7位;double占8个字节,有效数字16位。

习题2.2:
计算机按揭房贷时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
答:对于利率、本金和付款,都有可能是整数或实数,所以可以选择float,double,long double。为了保证精度和计算运行的耗时,所以均选用double类型(long double提供的精度过于精细对房贷来说没有必要且耗时较长)。

习题2.3:

  unsigned u = 10, u2 = 42;
  std::cout <<  u2 - u << std::endl;    //32
  std::cout <<  u - u2 << std::endl;    //4294967264
  
  int i = 10, i2 = 42;
  std::cout <<  i2 - i << std::endl;    //32
  std::cout <<  i - i2 << std::endl;    //-32
  std::cout <<  i - u << std::endl;    //0
  std::cout <<  u - i << std::endl;    //0

0开头的整数代表八进制数,以0x0X开头的代表十六进制数。
表2.2:常见转义序列:

名称符号名称符号
换行符\n横向制表符\t
纵向制表符\v退格符\b
反斜线\\问号\?
回车符\r进纸符\f
报警符\a双引号\"
单引号\‘空字符\0

表2.3:指定字面值的类型:

前缀含义类型
uUnicode16字符char16_t
UUnicode32字符char32_t
L宽字符wchar_t
u8UTF-8(仅用于字符串字面常量)char
整型字面值浮点型字面值
后缀最小匹配类型后缀类型
u or Uunsignedf or Ffloat
l or Llongl or Llong double
ll or LLlong long

习题2.5:指出下述字面值的数据类型并说明每一组内几种字面值的区别:
(a )‘a’,L’a’,“a”,L"a"
(b )10,10u,10L,10uL,012,0xC
(c )3.14,3.14f,3.14L
(d )10,10u,10.,10e-2
答:
(a )‘a’ 表示字符a,L’a’表示宽字符型字面值a且类型是wchar_t,"a"表示字符a,L"a"表示宽字符型字面值a且类型是wchar_t。
(b )10表示普通整数类型字面值10,10u表示无符号整数类型字面值10,10L表示长整数类型字面值10,10uL表示无符号长整数类型字面值10,012表示八进制数对应十进制数是10,0xC表示十六进制数对应十进制数是12。
(c )3.14表示普通浮点型字面值是3.14,3.14f表示float类型单精度浮点数,3.14L表示long double类型拓展精度浮点数。
(d )10表示普通整数类型字面值10,10u表示无符号整数类型字面值10,10.表示浮点数,10e-2表示科学计数法表示的浮点数是10x10-2=0.1

习题2.6:下面两组定义是否有区别,如果有,请叙述之:
int month = 9,day = 7;
int month = 09,day = 07;
答:
第一组是定义了两个十进制数10和7,正确
第二组是定义了两个八进制数,但八进制中没有9,所以错误 。
习题2.7:下述字面值表示何种含义?它们各自的数据类型是什么?
(a )“Who goes with F\145rgus?\012”
(b )3.14e1L
(c )1024f
(d )3.14L
答:
(a )“Who goes with F\145rgus?\012” 输出为"Who goes with Fergus?" 其中\145表示e,\012表示换行符。
(b )3.14e1L 科学计数法表示的拓展精度浮点数(long double) 表示为3.14x101=31.4。
(c )1024f 编译错误,若想表示为单精度浮点数(float)应改为1024.f。
(d )3.14L 表示为拓展精度浮点数(long double) 数值为3.14。

习题2.8:请利用转移序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。
答:

#include <iostream>
using namespace std;
int main()
{
	cout<<"2\x4d\012";    //\x4d中x4d表示16进制数对应十进制的77,\77表示为M \012对应换行符
	cout<<"2\tM\n";	      //\t表示制表符,\n表示换行符
	return 0;
}

2.2 变量

习题2.9:解释下列定义的含义。对于非法的定义,请说明错在何处并改正。
(a )std::cin >> int input_value; 改为int input_value; std::cin >> input_value; 运算符右侧不能定义变量
(b )int i = { 3.14 }; 有warning,3.14小数部分数据丢失
(c )double salary = wage = 9999.99; 改为 double salary,wage;
(d )int i = 3.14; 有warning,3.14小数部分数据丢失

习题2.10:下列变量的初值分别是什么?

std::string global_str;
int globa_int;
int main()
{
    int local_int;
    std::string local_str;
}

答:对于string类型来说,在函数体内和外均为空串。对globa_int,在函数体外,初值为0,对local_int,在函数体内,初值为奇异值。

在函数体外初始化时,会被默认初始化为0。

习题2.11:指出下面语句是声明还是定义:
(a )extern int ix = 1024; 定义
(b )int iy; 声明+定义
(c )extern int iz; 声明

表2.4:C++关键字及操作符替代名:

名称名称名称名称名称名称名称
alignasalignofasmautoboolbreakcase
catchcharchar16_tchar32_tclassconstconstexpr
const_castcontinuedecltypedefaultdeletedodouble
dynamic_castelseenumexplicitexportexternfalse
floatforfriendgotoifinlineint
longmutablenamespacenewnoexceptnullptroperator
privateprotectedpublicregisterreinterpret_castreturnshort
signedsizeofstaticstatic_assertstatic_caststructswitch
templatethisthread_localthrowtruetrytypedef
typeidtypenameunionunsignedusingvirtualvoid
voliatilewchar_twhileandbitandcompl
not_eqor_eqxor_eqand_eqbitornotor
xor

习题2.21: 请指出下面的名字中哪些是非法的?
(a )int double = 3.14; 非法,double是关键字代表数据类型 不能作为变量名
(b )int _; 合法
(c )int catch-22; 非法 表示中只能出现字母,数字和下划线。
(d )int 1_or_2 = 1; 非法 标识符必须以字母或下划线开头,不能以数字开头。
(e )double Double = 3.14;

习题2.13:下面程序中j的值是多少?

int i = 42;
int main()
{
    int i = 100;
    j = i;//j=100
}

习题2.14:下面的程序合法吗?如果合法,输出什么?

int i = 100,sum = 0;
for (int i = 0;i != 10; ++i)
    sum +=i;
std::cout<< i <<" "<< sum << std::endl;

答:合法,输出为100 45

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值