问题1 如何计算求模?
100000超过了16位的unsigned short类型的表示范围,编译器对其二进制表示截取低16位,相当于对65536求余(求模,%),得34464。
问题2
(a) "Who goes with F\145rgus?\012" 个人认为非法,此处的问号是啥意思?
习题2.1 int long 和short 类型之间有什么差别?
都表示整形值,存储空间不同。short 定义半个机器字,int 和long 定义一个机器字长,也就是4个字节,32位。
习题2.2 整形数包含带符号的signed 和 无符号的unsigned。前者可以定义正数,负数和O ,后者可以定义0和正数。
如果在某机器上short类型占16位,那么可以赋给short类型的最大数是什么?unsigned short类型的最大数又是什么?
short 默认是signed 类型,为 215-1=32767 ,也就是范围从-32767 ~32768
unsigned 类型只能是正数,最大数为216-1=65535 。也就是范围从0~65535
当给16位的unsigned short对象赋值100000时,赋的值是什么?
16位的unsigned 类型是范围是0~65535 ,赋值为100000时,产生溢出。
100000超过了16位的unsigned short类型的表示范围,编译器对其二进制表示截取低16位,相当于对65536求余(求模,%),得34464。
float类型和double类型有什么差别?
对于float类型来说,存储位数不同,f存储32位, double 存储64位。
所以取值范围不同,精度不同。f 表示6位有效数字,而 d 至少表示10位有效数字。
习题2.7
解释下列字面值常量的不同之处。
(a) ’a’,L’a’,"a",L"a"
(b) 10,10u,10L,10uL,012,0xC
(c) 3.14,3.14f,3.14L
’a’为char型字面值,L’a’为wchar_t型字面值,"a"为字符串字面值,L"a"为宽字符串字面值。
10为int型字面值,10u为unsigned型字面值,10L为long型字面值,10uL为unsigned long型字面值,012为八进制表示的int型字面值,0xC为十六进制表示的int型字面值。
3.14为double型字面值,3.14f为float型字面值,3.14L为long double型字面值。
习题2.8
确定下列字面值常量的类型:
(a) ?10 (b) -10u (c) -10. (d) -10e-2
【解答】
(a) int型
(b) unsigned int型
(c) double型
(d) double型
习题2.9
下列哪些(如果有)是非法的?
(a) "Who goes with F\145rgus?\012" 个人认为非法
(b) 3.14e1L (c) "two" L"some"
(d) 1024f (e) 3.14UL
(f) "multiple line
comment"
【解答】
(c) 非法。因为字符串字面值与宽字符串字面值的连接是未定义的。
(d) 非法。因为整数1024后面不能带后缀f。
(e) 非法。因为浮点字面值不能带后缀U。
(f) 非法。因为分两行书写的字符串字面值必须在第一行的末尾加上反斜线。
习题2.10
使用转义字符编写一段程序,输出2M,然后换行。修改程序,输出2,跟着一个制表符,然后是M,最后是换行符。
【解答】
输出2M、然后换行的程序段:
// 输出"2M"和换行字符
std::cout << "2M" << ’\n’;
修改后的程序段:
// 输出’2’, ’\t’, ’M’和换行字符
std::cout << ’2’ << ’\t’ << ’M’ << ’\n’;
习题2.11
编写程序,要求用户输入两个数??底数(base)和指数(exponent),输出底数的指数次方的结果。
程序调试出现问题:
0x004048c8指令引用的“0x0046f03c"内存。该内存不能为“written”。
access violation 访问冲突;
//之前这个句子写错了,删除然后添加下一句话后有结果std::cin>>"please input base and exponent" ;
#include "stdafx.h"
#include <iostream>
int main ()
{
int bas,exp;
long result=1;
//之前这个句子写错了,删除然后添加下一句话后有结果std::cin>>"please input base and exponent" ;
std::cout<<"please input base and exponent" <<std::endl;
std::cin>>bas>>exp;
for( int cnt=0;cnt<exp;cnt++)
result*=bas;
std::cout<<bas
<<"raised to the power of "
<<exp
<<":\t"
<<result<<std::endl;
return 0;
}
please input base and exponent
2 10
2raised to the power of 10: 1024
Press any key to continue
习题2.12
区分左值和右值,并举例说明。
左值(lvalue)就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。
右值(rvalue)就是变量的值,见2.3.1节。
变量名出现在赋值运算符的左边,就是一个左值;而出现在赋值运算符右边的变量名或字面常量就是一个右值。
例如:
val1=val2/8
这里的val1是个左值,而val2和8都是右值。
习题2.14
下面哪些(如果有)名字是非法的?更正每个非法的标识符名字。
(a) int double = 3.14159; (b) char _;
(c) bool catch-22; (d) char 1_or_2 =’1’;
(e) float Float = 3.14f;
【解答】
(a) double是C++语言中的关键字,不能用作用户标识符,所以非法。此语句可改为:double dval = 3.14159;。
(c) 名字catch-22中包含在字母、数字和下划线之外的字符“-”,所以非法。可将其改为:catch_22;。
(d) 名字1_or_2非法,因为标识符必须以字母或下划线开头,不能以数字开头。可将其改为:one_or_two;。