C++ Primer第五版学习 第四章第五章

2023-05-16

补第三章

size_t

size_t是一些C/C++标准在stddef.h/cstddef中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。
在32位架构中被普遍定义为:

typedef   unsigned int size_t;

而在64位架构中被定义为:

typedef  unsigned long size_t;
        size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。而int在不同架构下都是4字节,与size_t不同;且int为带符号数,size_t为无符号数。

为什么有时候不用int,而是用size_type或者size_t:

与int固定四个字节不同有所不同,size_t的取值范围是目标平台下最大可能的数组尺寸,一些平台下size_t的范围小于int的正数范围,又或者大于unsigned int. 使用Int既有可能浪费,又有可能范围不够大。

一、左值和右值

1. C++表达式要不然是左值,要不然是右值:

左值可以位于赋值语句的左侧,右值则不能;

一个左值表达式的求值结果是一个对象或一个函数,然而以常量对象为代表的的某些左值实际上不能作为赋值语句的左值运算对象。

一个简单归纳:当一个对象被用作右值时,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

2. 使用decltype关键字时,左值右值有不同

如果表达式的求值结果是左值,decltype作用于该表达式得到一个引用类型。

        例如:若p的类型是int*, 因为解引用运算符生成左值,所以decltype(*p)的结果是int &;

        取地址运算符生成右值,故decltype(&p)的结果是int**;

二、优先级和结合律和运算符

1. 括号无视优先级和结合律

2. 运算符优先级顺序表(复制的)

优先级运算符结合律助记
1::从左至右作用域
2a++a--
type()type{}
a()a[]
.->
从左至右后缀自增减、
函数风格转型、
函数调用、下标、
成员访问
3!~
++a--a+a-a
(type)sizeof&a
*a
new、 new[]delete、 delete[]
从右至左逻辑非、按位非、
前缀自增减、正负、
C 风格转型、取大小、取址、
指针访问、
动态内存分配
4.*->*从左至右指向成员指针
5a*ba/ba%b从左至右乘除、取模
6a+ba-b从左至右加减
7<<>>从左至右按位左右移
8<<=>>=从左至右大小比较
9==!=从左至右等价比较
10a&b从左至右按位与
11^从左至右按位异或
12``从左至右
13&&从左至右逻辑与
14``
15a?b:c
=+=-=*=/=%=&=^=、`
=<<=>>=`从右至左
16,从左至右逗号

3. 对书写复合表达式有益的两条经验

        a)拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求;

        b)如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。

                (当改变运算对象的子表达式本身就是另外一个子表达式的运算对象时该规则无效)

4. 递增和递减运算符

除非必须,否则不使用递增递减运算符的后置版本(即i++)

优先使用前置版本(++i)

前置和后置的区别:

      前置递增运算符:将对象本身作为一个值返回。

      后置递增运算符:将对象的原始值的副本作为一个值返回。

5. 成员访问运算符

ptr->mem 等价于 (*ptr).mem

6. 条件运算符(优先级很低,嵌套时最好带上括号)

cond ? expr1:expr2

cond为真执行expr1; 为假执行expr2。

当条件运算符的两个表达式都是左值或者能转换成同一种左值类型时,运算的结果是左值,否则是右值。(为了可读性,最好不要超过两到三层)

7. 位运算符&移位运算符&位求反运算符

作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。

提供检查和设置二进制位的功能。

关于符号位没有明确的规定,所以建议仅将位运算符用于处理无符号类型。

&

按位与操作,按二进制位进行"与"运算。运算规则:


0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;  
(A & B) 将得到 12,即为 0000 1100
|

按位或运算符,按二进制位进行"或"运算。运算规则:


0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;  
(A | B) 将得到 61,即为 0011 1101
^

异或运算符,按二进制位进行"异或"运算。运算规则:


0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;  
(A ^ B) 将得到 49,即为 0011 0001
~

取反运算符,按二进制位进行"取反"运算。运算规则:


~1=-2;   
~0=-1;  
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
<<二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。A << 2 将得到 240,即为 1111 0000
>>二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。A >> 2 将得到 15,即为 0000 1111

8. sizeof运算符

返回一条表达式或一个类型名字所占的字节数。

满足右结合律,所得的值是一个size_t类型的常量表达式。

两种形式:

sizeof (type)    
sizeof expr    //返回表达式结果类型的大小,并不实际计算其运算对象的值

一些例子

Sales_data data, *p;
sizeof(Sales_data);            //Sales_data类型的对象所占的空间大小
sizeof data;                   //data类型的大小,结果如上
sizeof p;                      //指针所占的空间大小
sizeof *p;                     //指针所指的类型所占的空间大小,即sizeof(Sales_data)
sizeof data.revenue;           //Sales_data的成员reveune对应类型的大小
sizeof Sales_data::revenue;    //Sales_data的成员reveune对应类型的大小

sizeof 运算符的结果部分地依赖于其作用的类型:

  • 对char或者类型为char的表达式执行sizeof运算符,结果得1。
  • 对引用类型执行sizeof运算得到被引用对象所占空间的大小。
  • 对指针执行sizeof运算得到指针本身所占空间的大小。
  • 对解引用指针执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效。
  •  对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有的元素各执行一次sizeof运算并将所得结果求和。注意,sizeof运算不会把数组转换成指针来处理。
  • 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。

因为执行sizeof运算可以得到整个数组的大小,则可以用数组的大小初一单个元素的大小得到数组中元素的值。

9. 逗号运算符

优先级最低,实例 

int somevalue = 1;
cout<<(somevalue?++x,++y:--x,--y);
//这里输出的是y的值,无论somevalue判断后是真还是假,都输出逗号右边的值;

cout<<("idhiw","voenivef"); 
//加了括号的话就是输出最右边的表达式,没加括号就不行,因为逗号运算符的优先级最低。

三、类型转换

1. 相互转换(相互关联)

如果两种类型有关联,那么当程序需要其中一种类型的运算对象时,可以用另一种关联类型的对象或值来替代。即若两个类型可以相互转换的话,则称它们是相互关联的。

2. 隐式转换

何时发生:

  • 在大多数表达式中,比int类型小的整型值首先提升为较大的整数类型
  • 在条件中,非bool值转化为bool值
  • 初始化过程中,初始值转换成变量的类型,在赋值语句中,右侧运算对象转换成左侧运算对象的类型
  • 如果算术关系或运算关系的对象有多种类型,需要换换成同一种类型
  • 函数调用也会发生类型转换

3. 算术转换C/C++ 算术转换规则 (以及容易踩的坑)_茶佬牛逼-CSDN博客算术转换指的是运算符的两个操作数类型不同时所发生的转换,不要小看这个点,可能会造成灾难性的程序问题。首先需要明确两个概念,后面要介绍的转换规则会依赖于这两个概念:一、整型提升https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion算术运算符不接受小于int类型的变量,所以会存在以下的整型提升:signed char、signed short:转换为intunsigned charhttps://blog.csdn.net/yuejisuo1948/article/details/121666396

把一种算术类型转换成另外一种算术类型。

        整型提升:负责把小整数类型转换为较大的整数类型。

        无符号类型的运算对象:如果某个运算符的运算对象不一致,这些运算对象将转换恒同一种类型。但是如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个整数类型的相对大小了。

        如果一个运算对象是无符号类型,另外一个运算对象是带符号类型,而且其中的无符号类型不小于带符号类型,那么带符号的运算对象就转化成无符号的。

四、try语句块和异常处理

1. 典型的异常:失去数据库连接、遇到意外输入等。  

        bad_alloc:       请求分配内存失败, operator new 或者 operator new []

        bad_exception: 函数异常,通常是函数运行错误,抛出的异常

        bad_typeid:   类型异常,通常用typeid操作符,作用于一个NULL指针时,而该指针是带有虚函数的类,这时抛出bad_typeid异常

        bad_cast:    转换异常,使用dynamic_cast转换引用失败的时候

2. 异常处理机制

        a)异常检测

                throw表达式:异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw印发了异常。

if(a != b)
    throw runtime_error("Data must refer to same value");

        b)异常处理

                try语句块:try以关键字try开始,并以一个或多个catch子句结束。try语句块中抛出的异常通常会被某个catch字句(也被称为异常处理代码)处理。

int a, b;
while(cin >> a >> b){
    try{
        if(a != b)
            throw runtime_error("Data must refer to same value");
    }catch(runtime_error err){
        cout << err.what() << "\nTry Again? Enter y or n" << endl;
        char c;
        cin >> c;
        if(!cin || c == 'n') break;
    }
}

上面的代码中,try语句块中如果判断a与b不相等,就抛出一个runtime_error类型的异常,try语句块后有一个与之相对应的catch语句,那么就会执行该catch语句来处理异常。

what函数返回值是一个指向C风格字符串的const char*。what函数返回的C风格字符串的内容与异常对象的类型有关。如果异常类型有一个字符串初始值,则what返回该字符串。对于其他吴初始值的异常类型来说,what返回的内容由编译器决定。

3. 标准异常

a)exception头文件:定义了最通用的异常类exception。它只报告异常的发生,不提供任何额外信息。

b)stdexcept头文件:定义了几种常用的异常类。

        logic_error

Runtime error exception

c)new头文件:定义了bad_alloc异常类型。

d)type_info头文件:定义了bad_cast异常类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer第五版学习 第四章第五章 的相关文章

随机推荐

  • torchvision与torch的对应关系及下载链接

    https github com pytorch vision 另外 xff1a Ubuntu18下编译安装torchvision C 43 43 API的详细过程
  • Logisim计算机组成原理实验16位无符号比较器设计

    Logisim用4位无符号比较器构建16位无符号比较器 4位无符号比较器设计思路表达式构建 16位无符号比较器构建思路构建 4位无符号比较器设计 思路 不同位之间进行比较 xff0c 高位优先 真值表太麻烦 xff0c 可以利用表达式进行构
  • React+hooks+TS练习

    一 初始化项目 通过create react app命令创建项目 xff0c template表示使用typescript xff08 node版本高于14才能使用npx xff09 npx create span class token
  • 基于Python的信用卡欺诈检测机器学习案例报告

    本报告借助Python语言探究了在机器学习中 面对一个大型的人与人之间交易的数据集 如何尽快处理大量数据并区分某交易记录是正常的用户行为还是潜在的信用卡欺诈行为 最终通过构建分类模型来对欺诈交易进行分类区分 并通过恰当的方式对构建的模型进行
  • 一个既有趣又简单的整人代码——关机代码

    这一篇博客来的比我的预计时间要长啊 xff0c 在这一周多的时间里 xff0c 我几乎很少有休息和出去玩耍的时间 说实话 xff0c 这样忙碌的生活给我的感觉还是蛮好的 xff0c 让我有一种很充实的感觉 xff0c 有种自己在与时间赛跑的
  • 【CMake】CMakeList编写整理

    什么是CMake 如果软件想跨平台 xff0c 必须要保证能够在不同平台编译 而如果使用 Make 工具 xff0c 就得为每一种标准写一次 Makefile CMake 就是针对上面问题所设计的工具 xff1a 它首先允许开发者编写一种平
  • 解决 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...警告

    解决 WARN util NativeCodeLoader Unable to load native hadoop library for your platform using builtin java classes where ap
  • Vue获取数组的数组数据

    Q xff1a 如何在vue获取数组的数组 xff1f A xff1a 用到js的map对象方法 一 data里要先定义好有两个数组 二 主要代码 这样就可以获取到数组的子数组数据
  • Ubuntu18.04 GAAS学习笔记

    GAAS学习笔记 1 环境构建1 1 依赖项安装1 2 ros安装1 3 MAVROS安装1 4 PX4 Firmware安装 全程参考官方文档 xff0c 总结遇见的错误 xff1a https gaas gitbook io guide
  • ArUco标定板生成与打印

    链接如下 xff1a https span class token punctuation span span class token operator span chev span class token punctuation span
  • ROS工作空间与功能包

    工作空间 工作空间 xff08 workspace xff09 是一个存放工程开发相关文件的文件夹 xff0c 其目录下有 xff1a src xff1a 代码空间 xff08 Source Space xff09 build xff1a
  • Ubuntu20.04安装UHD及GUN Radio3.9

    目录 1 安装UHD依赖库及UHD 2 安装GNU Radio3 9 3 1 安装UHD依赖库及UHD 总结自 xff1a USRP Hardware Driver and USRP Manual Building and Installi
  • ros安装的依赖问题

    问题描述 xff1a ros kinetic desktop full 依赖 ros kinetic desktop 但是它将不会被安装 依赖 ros kinetic perception 但是它将不会被安装 依赖 ros kinetic
  • STM32MP157驱动开发——字符设备驱动

    一 简介 字符设备是 Linux 驱动中最基本的一类设备驱动 xff0c 字符设备就是一个一个字节 xff0c 按照字节 流进行读写操作的设备 xff0c 读写数据是分先后顺序的 比如我们最常见的点灯 按键 IIC SPI xff0c LC
  • Java样卷

    一 问答题 请解释一下Java语言的主要特点 至少说明五个特点 进程和线程的概念是什么 xff1f 两者有什么区别和联系 什么是流 xff1f 什么是字节流 xff1f 什么是字符流 xff1f 字节流和字符流的差别是什么 xff1f 二
  • CodeBlocks如何将英文环境改为中文

    一 下载汉化包 xff08 链接如下 xff09 链接 xff1a https pan baidu com s 1U FMZuFvFQ9 70whXcIwQ 提取码 xff1a 2333 二 选择路径 将汉化包中的文件 xff08 Code
  • 浅谈多任务学习

    目录 一 前言及定义 二 多任务学习 xff08 MTL xff09 的两种方法 2 1 参数的硬共享机制 xff08 hard parameter sharing xff09 2 2 参数的软共享机制 xff08 soft paramet
  • PyTorch在GPU上跑代码需要迁移哪些东西?

    一 数据 模型 损失函数需要迁移到GPU上 使用GPU训练时 xff0c 数据 函数和模型都必须同时放在GPU上 xff0c 否则会出错 xff08 1 xff09 判断GPU是否可用 if torch cuda is available
  • C++ Primer 第五版学习 第一、二章

    一 标准输入输出 cin是标准输入 xff08 istream对象 xff09 cout是标准输出 xff08 ostream xff09 cerr是标准错误 xff0c 用来输出警告和错误消息 clog用来输出程序运行时的一般性信息 二
  • C++ Primer第五版学习 第四章第五章

    补第三章 size t size t是一些C C 43 43 标准在stddef h cstddef中定义的 这个类型足以用来表示对象的大小 size t的真实类型与操作系统有关 在32位架构中被普遍定义为 xff1a typedef un