C++primer plus第三章--处理数据

版权声明:@语言怪 https://blog.csdn.net/qq_38898947/article/details/86653638

第三章:处理数据

复杂是简单的集合哈哈=-=日常思辨;;;
一. 变量
信息存在计算机中,程序需知道3个属性:

  • 地址(编译器帮忙做了)

  • 类型

     变量名命名方案: 
    
     1. 有意义:cost_of_trip或costOfTrip(多个单词使用下划线或第二个单词起大写)
     2. 知类型:如:n(整数),str(字符串),b(布尔),p(指针),c(字符).
        如:nMyWeight
    

二. 整型
在这里插入图片描述
C++提供了灵活的标准,位数并不是固定的,int可以为16,24,32,甚至64位:
在这里插入图片描述
字节通常是8位的内存单元,但C++对字节的定义与此不同。C++字节至少能容纳基本字符集。
ASCII可以用8位容纳,C++字节通常包含8位,国际编程如unicode需要更大字符集,依据实现可能使用16位甚至32位,依具体实现而定,如32位的int可能只占两个字节(每个字节16位)。

头文件climits包含了整型限制信息。sizeof可以返回类型或变量的字节长度。
sizeof (INT_MAX)或sizeof (int),其中变量括号可选的,sizeof INT_MAX也可以。

c++没有提供自动防止超出整型限制的功能(可能因为类型转换),可从climits了解限制情况。

cout<<INT_MAX;

初始化:

C int a=1;
C++ int a(1);
C++11 int a{1};(符合类的初始化,更统一)

以上三种都可以。

谈一下对char类型的理解:
char本质是个整数,‘A’为字符常量,可以参与算术运算。但遇到cout时输出字符,或许这就是oop吧;
顺便提一下通用字符名:以\u或\U开头和wchar16_t和char32_t类似.
cout<<"Let them eat g\u00E2teau."IOS10646和Unicode已经开始合作,通用化。

cout.put()  输出单个字符
转义字符:
/a  振铃
/b  退格

浮点类型的精度问题参考这篇文章

https://blog.csdn.net/dreamer2020/article/details/24158303

注意网上的精度讨论比较混乱!
看懂了上面文章也就理解了计算机进行小数运算出错原因:

一个小数是{2^-1,2^-2,2^-3........}的组合,不连续性造成了误差。
提一下小数的二进制转化:将十进制小数乘2,整数为1保留,否则为0.
如:0.7=(0.1 0110 0110...)B 
  0.7*2=1.4========取出整数部分1 
  0.4*2=0.8========取出整数部分0 
  0.8*2=1.6========取出整数部分1 
  0.6*2=1.2========取出整数部分1 
  0.2*2=0.4========取出整数部分0  
  0.4*2=0.8========取出整数部分0 
  0.8*2=1.6========取出整数部分1 
  0.6*2=1.2========取出整数部分1 
  0.2*2=0.4========取出整数部分0

0.7对应无限的二进制小数,不可能全部保留,从而造成误差。(存的不准确,算的不准确)

如何避免计算机计算出错:
1.回避策略,忽略微小误差。
2.小数换成整数计算,再换回去,类似数学中的换元法。
具体参考<<程序是怎么跑起来的>>第三章
类型转换
C++自动执行很多类型转换,知道这些转换将更好理解程序的结果。下面讨论的都是内置类型。

  1. 初始化和赋值进行的转换。大类型转小类型容易造成结果不确定性。
  2. 列表初始化转换(C++11,要求更加严格)
    不允许缩窄,和类型无关,只要够存。让编译器知道够存,它不能跟踪:从x被初始化到它用来初始化c。
    const int code = 66;
    int x=66;
    char a{66};//可以
    char b{code};//可以
    char c{x};//不可以,不知道x的值,int可能比char大。或者可以理解为x不是常量。

3.表达式的转换。
整数提升:鉴于整数计算的快捷性,不论表达式有没有其他类型,都转化为int(比int小的类型如bool,char,unsigned char,signed char,short)。
小类型转化为大类型。
4.传递参数时转换。
5.强制类型转换。

(typeName) value //C风格
typeName(value)  //C++风格,看起来更像函数调用
static_cast<typeName>(value)//C++风格,更加严格

上诉方式都行,考虑C兼容的话,选择C风格。

C++11中的auto声明:
浮点常量默认情况下为double类型

auto a=8.25f/2.5   其中a为double类型!!!!!!!

处理复杂类型,auto的设计性才体现出来!如STL中的类型,自动推断的作用显现出来。

std::vector<double>scores;
auto pv=scores.begin();

书中一些有意思的见解:

  • oop的本质是设计并拓展自己的数据类型,在创建自己的数据类型之前,必须了解并理解C++内置的数据类型,因为这些类型是创建自己类型的基本组件。
  • Stroustrup认为,C语言式的强制类型转换由于有过多的可能性而极其危险。static_cast<>比传统强制类型转换更严格
  • 开始,读者可能觉得大量的C++基本类型有些多余,尤其是考虑到各种转换规则时。但是很可能最终将发现,某些时候,只有一种类型是需要的,此时你将感谢C++提供了这种类型。

猜你喜欢

转载自blog.csdn.net/qq_38898947/article/details/86653638