范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

繁书简读之CPrimerDay2变量和基本类型

  2.1 基本内置类型
  基本内置类型包含算术类型和空类型。算术类型有包括字符/整数/浮点数/bool类型2.1.1 算术类型
  类型
  含义
  最小位宽
  bool
  布尔类型
  未定义
  char
  字符类型
  8bit
  wchar_t
  宽字符
  16bit
  char16_t
  Unicode字符
  16bit
  char32_t
  Unicode字符
  32bit
  short
  短整型
  16bit
  int
  整形
  16bit(在32/64位机器上是32bit)
  long
  长整型
  32bit
  long long
  长整型
  64bit
  float
  单精度浮点型
  6位有效数字
  double
  双精度浮点型
  10位有效数字
  long double
  扩展精度浮点型
  10位有效数字
  1. bool类型的取值是true或false
  2. int/short/long都带有符号,char是否带符号与编译器有关,建议使用signed char或unsigned char
  3. 无符号类型只能表达非负数
  4. Cpp提供了多种字符类型:
  a) char:一个char空间应确保可以存放机器基本字符集中任意字符对应的数值,即1个char=1个机器字节
  b) wchar_t:宽字符,用于扩展字符集,wchar_t确保可以存放机器最大扩展字符集中的任意一个字符
  c) char16_t & char32_t:为Unicode字符集服务
  5. 类型选择建议:
  a) 确定数据为非负数时,选用unsigned类型
  b) 整数运算用int,数值太大时用long long
  c) 算术表达式不要使用char和bool类型
  d) 浮点运算用double,因为在计算机上float和double的计算代价相差不多2.1.2 类型转换
  1. 原则:
  a) 把非bool型的算术值赋给bool型,初始值为0则结果为false,否则结果为true
  b) 把bool型赋给非bool型时,初始值为false则结果为0,否则结果为1
  c) 把浮点数赋给整数类型时,结果值仅保留浮点数中的整数部分
  d) 把整数值赋给浮点类型时,小数部分记为0。如果整数所占空间超过了浮点型的容量,可能带来精度损失
  e) 赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数(例如8bit能表示的数值是0-255,即总数是256)取模后的余数
  f) 赋给有符号类型一个超出范围的值,属于undefined behavior
  g) 程序尽量避免依赖于实现环境的行为,例如int的尺寸在不同环境可能不同
  2. 表达式中既有无符号数又有有符号数时,有符号数会被转换成无符号数
  3. 无符号数不会小于0这一事实关系到循环的写法for (unsigned u = 10; u >= 0; --u) std::cout << u << std::endl; //此处for循环条件将永远成立2.1.3 字面值常量
  1. 整形和浮点型字面值
  a) 整形字面值中以0开头的代表八进制数,以0x或0X开头的代表十六进制数,以0b或者0B开头的为二进制数。C++14新增了单引号"形式的数字分隔符。数字分隔符不会影响数字的值,但可以通过分隔符将数字分组,使数值读写更容易。std::cout << 0B1"101;   // 输出"13" std::cout << 1"100"000; // 输出"1100000"
  b) 默认情况十进制字面值为有符号型
  c) 浮点型字面值默认时double型,可以用小数或者科学计数法表示,科学计数法中的指数部分用E或e标识1.2 .003 1.23E2 0e0
  2. 字符和字符串字面值
  a) 由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符称为字符串字面值
  b) 字符串字面值的类型是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符"",因此字符串字面值的实际长度要比它的内容多一位,这里需要注意常用函数strlen和运算符sizeof的区别,对于字符数组,strlen计算的是不包含‘‘的长度,而sizeof计算的是包含’‘的长度
  3. 转义序列
  含义
  转义字符
  newline
  horizontal tab
  alert (bell)
  a
  vertical tab
  v
  backspace
  b
  double quote
  "
  backslash
  question mark
  ?
  single quote
  "
  carriage return
  r
  formfeed
  f
  4. 泛化转义序列:形式是x后紧跟1个或多个十六进制数字,或者后紧跟1个、2个或3个八进制数字,其中数字部分表示字符对应的数值。如果后面跟着的八进制数字超过3个,则只有前3个数字与构成转义序列;相反,x要用到后面跟着的所有数字。  12 40 M 115
  5. bool字面值和指针字面值true false nullptr2.2 变量
  变量提供一个具名的、可供程序操作的存储空间。 C++中变量和对象一般可以互换使用,对象通常指一块能存储数据并具有某种类型的内存2.2.1 变量定义
  1. 形式:类型说明符(type specifier) + 一个或多个变量名组成的列表。如int a = 0, b;
  2. 初始化:对象在创建时获得了一个特定的值。
  a) 初始化不等于赋值,而是创建变量并赋予一个初值
  b) 用花括号初始化变量成为列表初始化(list initialization),当用于内置类型的变量时,使用列表初始化且初始值存在信息丢失风险时,编译器会报错
  3. 默认初始化:
  a) 对于内置类型,定义于任何函数体之外的变量被初始化为0,函数体内部的变量将不被初始化(uninitialized)
  b) 定义于函数体内的内置类型对象如果没有初始化,则其值未定义,使用该类值是一种错误的编程行为且很难调试。类的对象如果没有显式初始化,则其值由类确定
  c) 建议初始化每一个内置类型的变量2.2.2 变量声明和定义的关系
  1. 为了支持分离式编译,C++将声明和定义分开,声明(declaration)使得名字为程序所知,定义(definition)负责创建与名字相关联的实体;还有一种说法,声明并没有分配内存,而定义则是为变量分配了内存
  2. 只声明而不定义:在变量名前添加关键字 extern,如extern int a; 但如果包含了初始值,就变成了定义:extern int b = 3;
  3. 变量只能被定义一次,但是可以多次声明。定义只出现在一个文件中,其他文件使用该变量时需要对其声明2.2.3 标识符:
  字母数字下划线开头,大小写敏感,具体命名规范:
  1. 标识符尽量体现实际含义
  2. 变量名一般小写
  3. 用户自定义的类类型一般以大写字母开头
  4. 包含多个单词的标识符,使用驼峰命名法2.2.4 名字的作用域
  1. 定义在函数体之外的名字拥有全局作用域(global scope)。声明之后,该名字在整个程序范围内都可使用
  2. 变量最好第一次使用变量时再定义它
  3. 嵌套的作用域
  a) 同时存在全局和局部变量时,已定义局部变量的作用域中可用::var显式访问全局变量var。
  b) 但是用到全局变量时,尽量不使用重名的局部变量2.3 复合类型
  复合类型就是基于其他类型定义的类型,引用和指针是其中两种2.3.1 引用
  1. 引用为对象起了另外一个名字,引用类型引用(refers to)另外一种类型,通过将声明符写成&d的形式来定义引用类型,其中d是变量名称。初始化引用时,是将引用和对象绑在一起。
  2. 特点:
  a) 引用不是对象,只是对象的别名
  b) 引用的类型要与之绑定的对象严格匹配
  c) 引用无法重定向
  d) 引用必须初始化
  e) 引用只能绑定对象,不能是字面值或者表达式2.3.2 指针
  1. 指针本身就是一个对象,允许对指针赋值和拷贝,而且在生命周期内它可以先后指向不同的对象
  2. 通过将声明符写成*var的形式来定义指针类型,其中var是变量名称。如果在一条语句中定义了多个指针变量,则每个量前都必须有符号*int *p1, *p2
  3. 特点:
  a) 是实实在在的对象
  b) 不必要初始化,但建议初始化所有指针
  c) 可以重定向
  d) 可以有二级指针,即指向指针的指针,而不能有引用的引用
  4. 不能定义指向引用的指针,因为引用不是对象,没有实际地址,可以定义指向指针的引用
  5. 复杂写法int *p; int *&r = p; //r是对指针p的引用
  面对上述复杂写法,从右向左读更容易理解,首先r是一个引用,它引用的类型是一个int *的类型
  6. 空指针int *p = nullptr; int *p = 0; int *p = NULL; //以上三种写法都可以用来定义空指针
  7. void *指针:注意void *指针和空指针是两回事,void *代表可以存放任意对象的地址,实际工程应用中一般仅在形参中用void *传导,到具体函数执行时需要把void *指针强制转换为特定类型
  8. 两个指针相减类型是ptrdiff_t2.3.3 理解复合类型的声明
  1. 指向指针的指针int ival = 1024; int *pi = &ival;	 // pi 指向int类型 int **ppi = &pi // ppi 指向一个指向int类型的指针
  2. 指向指针的引用(References to Pointers)int i = 42; int *p; 					// p 是一个指向int类型的指针 int *&r = p;  // r是一个int型指针的引用2.4 const限定符
  1. const对象必须初始化,一旦定义就不能再改变值
  2. 默认情况下,const对象仅在当前文件内有效,类似于C语言用static关键字定义的变量或函数,当多个文件定义了多个同名const变量时,各自在各自文件中有效
  3. 在多个文件间共享const对象
  a) 编译期确定的const对象,应该定义在头文件中,其他源文件包含该头文件,不会造成重复定义
  b) 运行时才能确定的const对象,应该在头文件中声明,源文件中定义,此时const对象的声明和定义前都该加上extern关键字//in file1.cpp extern const int var = func(); //in file1.hpp extern const int var;2.4.1 const引用
  1. const引用也叫常量引用,是对常量的引用,引用必须初始化,所以const引用也必须初始化
  2. 笔者觉得有必要强调一下,引用不是对象,因此const引用不是说引用是常量,而是说const引用不能改变其绑定的对象了cont int a = 1; const int &ra = a; ra = 2; 									//编译器会报错,因为ra是对常量的引用 int &rb = a; 					//编译器也会报错
  3. 笔者在前文已经介绍过引用的类型要和绑定的对象严格匹配,但是在const引用这里有两个例外:
  a) 初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可int a = 10; const int &r1 = a; 							//ok const int &r2 = 20; 					//ok const int &r3 = r1 * 2; 		//ok int &r4 = r1 * 2; 							//error
  b) 允许为一个const引用绑定非常量的对象/字面值或一般表达式double var = 1.23; const int &rvar = val; 		//ok
  4. 可以把非常量对象绑定到常量引用上,但是不能把常量绑定到普通非常量引用上2.4.2 指针和const
  这里有两个经常容易混淆的概念,即指针常量和常量指针。这里笔者的观点跟<>第五版中相关章节的描述正好相反。
  1. 常量指针:即指向常量的指针(*放在const右边),它代表指针所指向的对象是个常量,其值不能被改变const int a = 1; int *pa = &a; 						//error const int *q = &a; *q = 2; 										//error int b = 2; q = &b; 										//ok,但这里如果尝试通过q改变b的值是非法的
  2. 指针常量:又叫常指针(*放在const左边),首先它是个常量,即指针本身是个常量,所以指针本身不能改变指向,但其指向的值却可以改变int b = 0; int *const pb = &b; //pb指向了b的地址,且不能再改变指向
  3. 指向常量的常指针const double a = 3; const double *const pa = &a;
  4. 这里综合笔者读书时所学以及网上查到的相关资料总结,可以确认笔者的上述表述是对的,而原书中的表述可能会造成误解,请读者予以重点关注2.4.3 顶层const
  1. 顶层const表示对象本身是个常量,底层const表示指针或引用所指向的对象是一个常量。
  2. 注意:顶层const对任何数据类型都通用,但是底层const只用于引用和指针,再进一步,引用只有底层const
  3. 区分顶层const和底层const:按照表达式的定义从右向左读,顶层const再右边,底层const在左边const int &const ra = a; //error,这里出现了顶层const的引用
  4. 执行拷贝操作时,顶层const会被忽略,然而底层const却可不可以忽略2.4.4 constexpr和常量表达式
  1. 常量表达式(constant expressions)指值不会改变并且在编译过程就能得到计算结果的表达式, C++11允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式
  2. 指针和引用都能定义成constexpr,但是初始值受到严格限制。constexpr指针的初始值必须是0、nullptr或者是存储在某个固定地址中的对象
  3. 字面值属于常量表达式,由常量表达式初始化的const对象也是常量表达式
  4. 注意:如果用constexptr定义指针,则限定符仅对指针有效,与指针所指对象无关,即constexpr定义的对象具有顶层const属性
  5. const和constexpr异同:
  a) 二者限定的都是常量
  b) constexpr对象的值必须在编译期间确定,而const对象的值可以在编译器也可以在运行时确定
  c) constexpr变量是真正的"常量",而const现在更多表示"只读"
  6. 建议:
  a) 如果认定一个变量是常量表达式,就把它声明为constexpr类型2.5 处理类型2.5.1 类型别名
  1. 传统类型别名(尤其在C语言开发中)常用typedef来定义typedef double wages; // wages是double的别名 typedef wages base, *p; // base是double的别名, p是double *的别名
  2. C++11使用关键字using进行别名声明using wages = double;
  3. 指针/常量和类型别名typedef char *pstring; const pstring cstr = 0; //注意:此处cstr是一个指向char类型的指针常量(即指针本身是常量,不能改变其指向),不能直接将其按替换的方式理解为const char* cstr = 0(错误),错误的理解方式cstr就变成了常量指针2.5.2 auto类型说明符(C++11开始)
  1. auto说明符让编译器自动分析表达式所属的类型,auto定义的变量必须有初始值
  2. 一条声明语句只能有一个数据类型,所以当一个auto声明多个变量时,多个变量必须是同一个数据类型
  3. 复合类型,常量和auto:
  a) 编译器推断的auto类型有时和初始值并不一样,编译器会做调整
  b) auto根据引用来推断类型时会以引用对象的类型作为auto的类型
  c) auto一般会忽略顶层const,因此对于非指针类型的常量对象,auto推断的结果不含const;若希望auto推断出是顶层const,需要明确指出
  d) auto会保留底层const
  e) 一言以蔽之:auto会忽略引用与顶层constconst int ci = 10, cr = ci; auto b = ci; //b是普通int auto c = cr; //c是普通int const auto d = ci; //d是const int auto &e = ci; //e是常量引用(常量引用是底层const) auto f = &ci; //f是const int *(因为ci只读,指向它的指针是常量指针,具有底层const属性)
  f) int与int */int &是一个基本数据类型,而const int与int不是一种类型
  g) 用auto定义引用时,必须要用&明确标识,否则会被忽略2.5.3 decltype类型指示符(C++11新增)
  1. 从表达式的类型推断出要定义的变量类型,注意此过程编译器不会计算表达式的值
  2. 与auto不同,如果decltype使用的表达式是一个变量,则它返回该变量的类型(包括顶层const和引用)const int ci = 0, &cj = ci; decltype(ci) x = 0; 			// x 是const int decltype(cj) y = x; 			// y 是const int &类型 decltype(cj) z;						 // error: ,z是const int &类型,但未初始化
  3. decltype和引用:
  a) 若decltype使用的表达式不是变量,则返回表达式结果对应的类型,可以用这种方式来确保不获取到引用类型
  b) 注意,解引用指针的结果是一个引用类型,给变量加括号的结果也是引用类型(因为变量是一种可以作为赋值语句左值的特殊表达式),赋值操作的结果也是引用类型int a = 10, &r=a, *p; decltype(r + 0) b; 						//b类型是int decltype(*p) c = a; 				//c类型是int & decltype((a)) d = a; 				//d类型是int &2.6 自定义数据结构2.6.1 定义sales_data类型
  1. 格式:struct/class + 类名 + 类实体 + 分号,类实体可以为空
  2. C++11规定可以为类的数据成员提供一个类内初始值,创建对象时,类内初始值将用于初始化数据成员,没有初始值的成员将被默认初始化
  a) 类内初始值可以使用花括号或放在等号右边,不能使用圆括号
  b) 类定义最后要加分号2.6.2 使用sales_data类型2.6.3 编写自己的头文件
  1. 头文件通常定义只能被定义一次的实体,比如类,const和constexpr对象
  2. 确保头文件多次包含但不报重复定义的技术叫预处理器
  3. 头文件保护符(header guard)依赖于预处理变量,预处理变量一般大写, 预处理变量有两种形态:已定义和未定义
  4. C++包含3个头文件保护符:
  a) #ifndef,一旦为真,则执行后续操作到#endif为止
  b) #define,把一个名字设定为预处理变量
  c) #endif #ifndef __SALES_DATA_H__ #define __SALES_DATA_H__ … … … #endif
  也可以使用#pragma once来防止头文件重复包含

买了新电脑,必做的三件事新电脑到手后,这三件事情你一定要注意,可以让你的电脑一直流畅。新电脑一般都是win10以上的系统,有自动防护功能,不建议安装第三方的安全软件。它可能会导致你的电脑卡顿,并且还会有弹随时随地测心电!华为WATCH3新品月底见据博主厂长是关同学爆料的新消息,华为WATCH3ProECG版将在7月底的新品发布会上发布。新品最大的变化是升级了心电图功能,可以随时随地测量心电。此前华为已在WatchGT2Pr苹果手机不要乱买,目前这三款最值得买,再用三五年都不过时说起苹果手机大部分人的感觉都是苹果手机好,苹果手机流畅,安全性高,没有广告sao扰等等。那你知道那几款苹果手机zui值得购买吗?帮我点个关注点个赞我就告诉你开个玩笑怎么可能不会告诉散热规格与温控表现对比,红魔7S和ROG6游戏手机谁更值得入手?7月份这个暑期手游玩家关注的焦点毫无疑问是手机产品,特别是游戏手机这个时下最吸睛的品类,ROG6系列,红魔7S系列两个重磅游戏旗舰同期发布,并且两款机型都搭载了目前最顶尖的芯片第一1。17。1新玩法新精彩,坦克世界街机模式邀你来玩坦克世界1。17。1版本日前已正式亮相,伴随新版本而来的是更多精彩的玩法模式。下周我们还将迎来钢铁纪元领土战的开启,近期的坦克世界看点实在是太多,小编就不信吸引不了大家的注意。1。畅享极限竞速,红魔7S系列行业首发QQ飞车手游165Hz高帧模式QQ飞车手游作为一款国民级竞速类游戏,多年来以游戏中潮流定位的特色赛道与经典赛车,一如既往的高质量竞速单局,多样的休闲玩法收获了无数粉丝玩家。同时QQ飞车手游无疑也是一款与时俱进的iPhone14超大杯摄像头为了影像牺牲厚度?来看看国产旗舰怎么做吧如果要说手机上设计的重点,毫无疑问就是背面了。最近就有网友爆料放出iPhone14ProMax的外观设计图纸,手机背面的外观可以说是一览无余了。从这份图纸中我们可以看到,这款即将发下半年这3部手机最值得买,几乎零差评,再用五年没压力今年下半年学长推荐三款好评超多的手机,用到2027年没问题第一款IQOO9手机优点骁龙8gen1处理器性能过硬体验好内置独立显示芯片手机缺点散热一般功耗不低截止到目前安卓性能榜单前乐视员工神仙日子?全靠营销和衬托!最近,微博大VFenng分享了一个有点冷的消息现在的乐视剩下了400多名老员工,过着没有内卷和996,且不被拖欠工资和社保的日子。不少网友酸成了柠檬,觉得乐视员工过着没有老板的神仙告别三星!曝高通全新骁龙8系旗舰芯片由台积电代工分析师郭明錤发布推文称,我的最新调查显示,台积电将是高通在2023年和2024年5G旗舰芯片的独家供应商,这对两家公司来说,是一个超级双赢局面。郭明錤同时指出,高通一直是三星最先进iPhone15Pro概念机升降式四摄144Hz,科技感满满苹果作为一家有着强大研发能力的手机制造商。创造了许多引人注目的产品,这些产品极大地提升了苹果的影响力。当然,市场是优胜劣汰的地方。我相信,在未来,苹果手机将加强研发,为行业带来更多
以岭药业回复投资者连花清瘟可与布洛芬联用张伯礼此前建议尽量不要同服视频加载中12月19日,有投资者在深交所投资者互动平台提问连花清瘟能跟布洛芬等退烧药一块服用吗?以岭药业回复表示连花清瘟可以与解热镇痛药物(如布洛芬)联用,但需重点关注是否存在解热英国亿万富豪数量增加20增至177人英国卫报19日报道称,根据慈善机构平等信托的统计,自新冠肺炎疫情暴发以来,英国亿万富豪的数量增加20,从2020年的147人增至177人,这些富豪的财产中位数约为20亿英镑。报道称重新定义A0级市场,比亚迪海豚于死海中开辟蓝海在9月销量出来之前,公司内部就对比亚迪海豚的销量起了争论有编辑认为海豚的月销量不可能再突破2万辆,A0级市场的上限早已被钉死,月销量能够破万就已是超常表现也有编辑认为,海豚当下势头A股再现黑色周二!但我要告诉大家,底部已出现!对此我说3点!1今日低点就是趋势底部下午如约回补缺口,但随后却出现让人惊惧的底部砸跌!大盘最低跌至3061。51,所以即便后面1小时确实开始走V,但整体走势却没能如我提到的那般出现大幅走V。对此原创诗歌我在等你,你没有来我在等你,你没有来作者陈长杰我在等你,你没有来可我早已在你巍峨的青山春风吹拂着你飘香的秀发那一枝向阳的绿叶就是我为你怦然跳动的心我在等你,你没有来可我早已沐浴在你的河流水草摇曳着你不要追求利他,进入宇宙的顺流,自利利他是自然的呈现怎么才能活在当下?怎么才是活在当下?当你问这个问题的时候,就说明你没有活在当下,就是因为你把自己和当下分离了,你非要专注怎么活在当下。在我们没有真正的为自己的人生定果修因,全力以赴全景滨州冬日寻趣黄河边滨州日报滨州网综合冬日寻趣黄河边初冬的黄河再也不像是春天那样的欢喜雀跃前踴后挤也不像夏天那样的汹涌澎湃波浪滔天它带着秋天的成熟与平静缓缓的不再那么匆忙地来到了冬天几乎不动的水面像面祝你考研顺利,所行皆坦途!所求皆如愿所行皆坦途距离2023考研仅剩3天,各位考研人的复习进度也已经进入尾声。回望这段艰辛的备战史,无数与星辰作伴的夜晚,你一定憧憬过成人,假想过失败,但唯独没有放弃。其实考研运价暴跌后企稳!船公司计划在春节后取消一半亚洲出发的航次据悉,在需求预测极为疲软的背景下,船公司正准备在农历新年后取消约一半从亚洲到北欧和美国的航次。欧美高库存水平加上消费者需求的不确定性,导致订单被取消或推迟,中国工厂可能在春节前提前再融资步伐加快,万科A制定发行H股计划在股权融资松闸的第三支箭落地利好推动下,万科加快了再融资步伐的步伐,12月19日晚间,万科(000002)公告称,公司董事会制定了以新股配售方式向非关连人士发行境外上市外资股(H股2023年A股将出现结构性牛市?多家基金认可反转行情,消费和科技主线获青睐投资风向标华夏时报(www。chinatimes。net。cn)记者邱利陈锋北京报道时至年末,沪指再度在3000点附近横盘整理,距离公募基金年度业绩收官战越来越近,众多投资者也开始关注明年行