c++ primer 第五版 阅读笔记三

第三章 处理数据

  • 知识点提炼:

1. 内置C++类型:基本类型(整数和浮点数);复合类型(数组、字符串、指针、结构)。

2. C++命名规则:

3. 系统中整数的最大长度,可以通过C++ 工具来检查类型长度。首先,sizeof操作符返回类型或变量的长度,单位是字节。其次,头文件climits中包含了关于整型限制的信息(具体而言,就是它定义了表示各种限制的符号名称,例如:INT_MAX为int的最大取值,CHAR_BIT为字节的位数)。

#include <iostream>

using namespace std;

int main()
{
    int i;
    short s;
    long l;

    cout<<"sizeof(i):"<<sizeof(i)<<endl;
    cout<<"sizeof(s):"<<sizeof(s)<<endl;
    cout<<"sizeof(l):"<<sizeof(l)<<endl;

    cout<<"INT_MAX:"<<INT_MAX<<endl;
    cout<<"INT_MIN:"<<INT_MIN<<endl;

    cout<<"SHRT_MAX:"<<SHRT_MAX<<endl;
    cout<<"SHRT_MIN:"<<SHRT_MIN<<endl;

    cout<<"LONG_MAX"<<LONG_MAX<<endl;
    cout<<"LONG_MIN"<<LONG_MIN<<endl;

    return 0;
}

输出结果:

sizeof(i):4
sizeof(s):2
sizeof(l):4
INT_MAX:2147483647
INT_MIN:-2147483648
SHRT_MAX:32767
SHRT_MIN:-32768
LONG_MAX2147483647
LONG_MIN-2147483648

4.符号常量——预处理方式

5. 无符号类型:需要使用不含负数的设计时会使用到无符号类型,方法是:使用关键字unsigned来修饰声明。

#include <iostream>

using namespace std;

int main()
{
    unsigned short i_u = 0;
    short i = 0;

    cout<<"sizeof(i_u):"<<sizeof(i_u)<<endl;
    cout<<"sizeof(i):"<<sizeof(i)<<endl;

    cout<<"USHRT_MAX:"<<USHRT_MAX<<endl;
    //最小的无符号型整数是多少?
    cout<<"SHRT_MAX:"<<SHRT_MAX<<endl;
    cout<<"SHRT_MIN"<<SHRT_MIN<<endl;

    cout<<endl;

    cout<<"i_u - 2 : "<<i_u<<" - 2 = ";
    i_u -= 2;
    cout<<i_u<<endl;

    cout<<"-> i_u = 0,then:"<<endl;
    i_u = 0;
    cout<<"i_u - 65536 : "<<i_u<<" - 65536 = ";
    i_u -= 65536;
    cout<<i_u<<endl;

    cout<<endl;

    cout<<"-> i_u = 65535,then:"<<endl;
    i_u = 65535;
    cout<<"i_u + 1 : "<<i_u<<" + 1 = ";
    i_u++;
    cout<<i_u<<endl;

    cout<<endl;

    cout<<"i - 1 : "<<i<<" - 1 = ";
    i -= 1;
    cout<<i<<endl;

    return 0;
}

运行结果:

sizeof(i_u):2
sizeof(i):2
USHRT_MAX:65535
SHRT_MAX:32767
SHRT_MIN-32768

i_u - 2 : 0 - 2 = 65534
-> i_u = 0,then:
i_u - 65536 : 0 - 65536 = 0

-> i_u = 65535,then:
i_u + 1 : 65535 + 1 = 0

i - 1 : 0 - 1 = -1

总结

① 无符号型数(以int为例):数据范围:0-65535;当<或>这个范围时,值都是存在的,

用一个数轴表示可能更直观:

② 有符号型数(以int为例):

注意:C++ 提供了大量的整型,应使用哪种类型呢?

答:通常,int被设置为对目标计算机而言最为“自然”的长度。自然长度(natural size)指的是计算机处理起来效率最高的长度。如果没有非常有说服力的理由来选择其他类型,则应使用int。(话是这么说,不过还是灵活变通的选择鸭)

6. char类型:字符和小整数

char类型是专门为存储字符(如字母和数字)而设计的。ASCII码值(字符 - 十进制整数):‘A’-65,‘a’-97

#include <iostream>

using namespace std;

int main()
{
    char temp;
    int temp_i;
    cin>>temp;      //temp占用的内存区存储的是对应的ASCII码值,而不是字符
    temp_i = temp;
    cout<<"temp:"<<temp<<endl;
    cout.put(temp)<<endl;
    cout<<temp_i<<endl;

    cout<<"sizeof(temp)"<<sizeof(temp)<<endl;
    cout<<"sizeof(temp_i)"<<sizeof(temp_i)<<endl;
    return 0;
}

cout.put(x):这个函数可以用来显示一个字符;

输出结果:

A
temp:A
A
65
sizeof(temp)1
sizeof(temp_i)4

7. wcha_t

8. bool类型

9. const限定符

常量的符号名称,我的博客里有,还有可爱的例子:https://blog.csdn.net/qq_26949665/article/details/88553996

10. 浮点数

11. 浮点数的类型

注意:cout对于输出浮点数是有限制的:1. 通常cout会删除结尾的0,比如33.250000-->33.25,这可以通过cout.setf()解决这种行为,可以参考博客:https://blog.csdn.net/baishuiniyaonulia/article/details/79144033;2. 对于超过6位的小数,cout默认只会打印出小数点后六位(嗯。。。我的机器打印出了5位,不知道怎么解释)。

12. C++ 算术运算符:+、-、*、/(如果操作数都是整数,结果会丢弃小数部分)、%(两个操作数必须都是整数)

13. 表达式的转化:一些类型在出现时就会被转换(比如short会自动转换成int,再转换回来;),还有就是与其他类型进行表达式计算的时候也将被转换(把小类型转化为大类型得到的结果是大类型)

14. 强制类型转换的两种类型:

    1. 需要将变量转化成自己需要的类型时,比如:int a;(long) a;//或者使用long (a);也是同样的效果,不同类型的转化时要增添响应类型的变量

    2. 对一些格式进行限定时,比如cout<<int('Q');


复习题

1. 为什么C++ 有多种整型?

答:针对的需求不同,要求的长度、有无符号等情况不一样。

2. 声明与下述描述相符的变量:

a. short 整数,值为80;

b. unsigned int 整数,值为42110;

c. 值为3000000000的整数;

答:

a. short a = 80;

b. unsigned int = 42110; //或 unsigned = 42110;

c. long int a = 3000000000;

3. C++ 提供了什么措施来防止超出整型的范围?

答:C++没有提供自动防止超出整型限制的功能,可以使用头文件climits来确定限制情况。

4. 33L 与 33之间有什么区别?

答:类型不同。常量33L的类型为long,常量33的类型为int。

5. 下面两条C++ 语句是否等价?

char grade = 65;

char grade = 'A';

答:

6. 如何使用C++ 来找出编码88表示的字符?指出至少两种方法。

答:

/*法一:将整型变量放入字符型变量中,最后输出会输出对应变量的定义类型*/

#include <iostream>

using namespace std;

int main()
{
    char x = 88;
    cout<<x<<endl;

    cout<<sizeof(x)<<endl;

    return 0;
}
/*法二:只是在输出的时候对输出的型进行的强制类型转化,但是并不会给变其内容和原先的类型*/
#include <iostream>

using namespace std;

int main()
{
    int a = 88;
    cout<<char(a)<<endl;

    cout<<sizeof(a);
    return 0;
}
/*法三:只是把a强制转化为char传给c,但a的实际内容和类型是不发生变化的*/
#include <iostream>

using namespace std;

int main()
{
    int a = 88;
    char c = (char)a;

    cout<<c<<endl;

    cout<<"sizeof(a):"<<sizeof(a)<<endl;
    cout<<"sizeof(c):"<<sizeof(c)<<endl;
    return 0;
}

7. 将long值赋给float会导致舍入误差,将long赋给double呢?

答:

8. 下列C++ 表达式的结果分别是多少?

a. 8 * 9 + 2

b. 6 * 3 / 4

c. 3 / 4 * 6

d. 6.0 * 3 / 4

e. 15 % 4

答:

74

4

0

4.5

3

9. 假设 x1 和 x2 是两个类型为double的变量,而要将他们作为整数,并相加,然后将结果赋给一个整型变量。请编写一条完成这项任务的C++语句。

int a = (int)x1 + (int)x2;//int a = int(x1) + int(x2);


编程练习:

#include <iostream>

using namespace std;

int main()
{
    const int factor = 12;
    int height;
    int ft,in;      //ft表示英尺,in表示英寸;
//    cout<<"_";    //为什么加了一个输出语句就出错了?

    cin>>height;
    ft = height / factor;
    in = height % factor;
    cout<<height<<" =》 "<<ft<<"."<<in;
    return 0;
}

#include <iostream>

using namespace std;

int  main()
{
    double ft,in,height;
    double pon,weight;
    const float h = 0.0254;
    const float w = 5.0/11.0;
    double bmi = 0.0;

    cin>>ft>>in>>pon;
    height = (ft * 12 + in) * h;
    weight = pon * w;

    bmi = weight/(height*height);
    cout<<bmi;

    return 0;
}

#include <iostream>

using namespace std;

int main()
{
    int degrees,minutes,seconds;
    double num = 0.0;
    const double factor = 60.0;
    cout<<"Enter a latitude in degrees, minutes, and seconds:"<<endl;
    cout<<"First, enter the degrees: ";
    cin>>degrees;
    cout<<"Next, enter the minutes of arc: ";
    cin>>minutes;
    cout<<"Finally, enter the seconds of arc: ";
    cin>>seconds;
    num = degrees + minutes/factor + seconds/(factor * factor);
    cout<<degrees<<" degrees,"<<minutes<<" minutes,"<<seconds<<" seconds"<<" = "<<num<<" degrees"<<endl;

    return 0;
}

#include <iostream>

using namespace std;

int main()
{
    long seconds;
    int days,hours,minutes,second;
    const double factor1 = 60.0;
    const double factor2 = 24.0;

    cout<<"Enter the number of seconds: ";
    cin>>seconds;

    days = seconds /(factor1 * factor1 * factor2);

    hours = (seconds - factor1 * factor1 * factor2 * days) / (factor1 * factor1);
    if(hours < 0)
    {
        hours = 0;
    }

    minutes = (seconds - days * factor1 * factor1 * factor2 - hours * factor1 * factor1) / factor1;
    if(minutes < 0)
    {
        minutes = 0;
    }

    second = seconds -  days * factor1 * factor1 * factor2 - hours * factor1 * factor1 - minutes * factor1;

    cout<<seconds<<" seconds = "<<days<<" days,"<<hours<<" hours,"<<minutes<<" minutes,"<<second<<" seconds";

    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值