C/C++基础----变量和基本类型
变量和基本类型
不同平台下基本类型的字节数
|
类型 |
16位平台 |
32位平台 |
64位平台 |
|
char |
1 |
1 |
1 |
|
short |
2 |
2 |
2 |
|
int |
2 |
4 |
4 |
|
long |
4 |
4 |
8 |
|
long long |
/ |
8 |
8 |
|
指针 |
2 |
4 |
8 |
|
float |
4 |
4 |
4 |
|
double |
8 |
8 |
8 |
类型的最小尺寸
|
类型 |
含义 |
最小尺寸 |
|
bool |
布尔类型 |
未定义 |
|
char |
字符 |
8位 |
|
wchar_t |
宽字符 |
16位 |
|
char16_t |
Unicode字符 |
16位 |
|
char32_t |
Unicode字符 |
32位 |
|
short |
短整型 |
16位 |
|
int |
整型 |
16位 |
|
long |
长整型 |
32 |
|
long long |
长整型 |
64 |
|
float |
单精度浮点数 |
6位有效数字 |
|
double |
双精度浮点数 |
10位有效数字 |
|
long double |
扩展双精度浮点数 |
10位有效数字 |
数据类型选择的经验准则
- 当知晓数值不可能为负时,选用无符号类型
使用int执行整数运算,short常常太小,long和int一般尺寸一样。如果int不够,用long long。
在算数表达式中不要使用char或bool,使用char特别容易出问题。如果要使用一个不大的整数,那么明确执行为signed char或unsigned char。
执行浮点数运算用double,float通常进度不够而且两者计算代价相差无几。Long double一般没有必要,且消耗不容忽视。
有符号类型和无符号类型
- 无符号类型赋值超出其范围,结果是取模后的值。如unsigned char c = -1; //假设char占8bit,c的值为255
- 有符号类型赋值超出其范围,结果未定义。如signed char c2 = 256; //假设char占8bit,c2的值未定义
- 切勿混用带符号类型和无符号类型。
- 算数表达式中既有无符号数又有带符号数,带符号的数会转换成无符号的数
指定字面值的类型
|
字符和字符串字面值 |
|||
|
前缀 |
含义 |
类型 |
|
|
u |
Unicode16字符 |
char16_t |
|
|
U |
Unicode32字符 |
char32_t |
|
|
L |
宽字符 |
wchar_t |
|
|
u8 |
UTF-8(仅用于字符串字面常量) |
char |
|
|
整型字面值 |
浮点字面值 |
||
|
u or U |
unsigned |
f or F |
float |
|
l or L |
long |
l or L |
long double |
|
ll or LL |
long long |
||
初始化与赋值
初始化和赋值是两个完全不同的操作。
- 定义于函数体(块作用域)内的内置类型的对象如果没有初始化,则其值未定义。养成初始化内置变量的习惯。
- 类的对象如果没有显式地初始化,则其值由类确定。
声明与定义
- 声明使得一个名字为程序所知,定义会申请存储空间,还可能为其赋初始值
(分离式编译)
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量
- 对于复杂的声明语句,可以从变量名从右往左理解
指针
- 常见错误:解引用无效指针(空指针或已释放的指针)
- 建议:初始化所有指针,并且尽量等定义了对象之后再定义指向它的指针。
- 推荐nullptr而非0,0指针具有二义性。
const和constexpr
const对象默认在文件内有效,当多个文件出现了同名const变量,等同于不同文件中定义了独立的变量。
如果想不同文件之间共享const,则不管在声明还是定义中都添加extern关键字。
顶层const表示本身是个常量,底层const表示指针指向的对象是一个常量。
- 执行对象拷贝操作时,顶层const不受影响,底层const却不容忽视
常量表达式:值不会改变且在编译阶段就能计算结果的表达式。
- 复杂系统中很难分辨初始化是不是常量表达式,C11允许声明为constexpr由编译器来验证
尽管指针和引用可以定义成constexpr,其初始值受到严格的限制。constexpr指针的初始值必须是nullptr或者0,或者是储存于某个固定地址中的对象。储存于函数体之外的对象其地址固定不变,能用来初始化constexpr指针。
auto与decltype
- auto一般会忽略掉顶层const,同时保留底层const。
decltype的表达式是一个变量,则decltype返回该变量的类型,包括顶层const和引用在内。
- decltype如使用的表达式不是一个变量,则返回表达式结果对应的类型。
如表达式是解引用操作,则得到引用类型。
如果是加了双层括号的变量,则结果永远是引用。
预处理变量无视C++中关于作用域的规则
C/C++基础----变量和基本类型的更多相关文章
- C#_02.12_基础二_.NET类型存储和变量
C#_02.12_基础二_.NET类型存储和变量 一.核心一句:C#程序是一组类型声明(留待后面慢慢体会,现在不是很理解,不强说了) 二.数据类型: 1.预定义了16种数据类型: 其中13种简单数据类 ...
- 前端知识体系:JavaScript基础-变量和类型
前端工程师自检清单 1. JavaScript规定了几种语言类型 2. JavaScript对象的底层数据结构是什么 3. Symbol类型在实际开发中的应用.可手动实现一个简单的 Symbo 4. ...
- typescript学习笔记(一)---基础变量类型
作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...
- 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值
016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...
- GO语言基础(结构+语法+类型+变量)
GO语言基础(结构+语法+类型+变量) Go语言结构 Go语言语法 Go语言类型 Go语言变量 Go 语言结构 Go 语言的基础组成有以下几个部分: 包声明 引入包 函数 变量 语句 &a ...
- Javascript基础回顾 之(一) 类型
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- [.net 面向对象编程基础] (5) 基础中的基础——变量和常量
[.net面向对象编程基础] (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- 5、C#基础 - C#的值类型
1.C#的值类型 有几个特点: 存储在栈里 基于值类型的变量直接包含值(值类型存储实际值). 将一个值类型变量赋给另一个值类型变量时,将复制包含的值. 这与引用类型变量的赋值不同,引用类型变量的赋值只 ...
随机推荐
- Winform中用comboBox来选择显示Dataset中表格数据
这是一次偷懒的尝试,因为每次都必须打开代码,调试才能看见数据,发现问题.也是借鉴了调试中查看dataset数据的模式,查看不同表格.经历一番研究,总算实现了想要的效果了,故作此一笔记.与人共享. 界面 ...
- Cetus
转自:https://github.com/Lede-Inc/cetus Cetus 简介 Cetus是由C语言开发的关系型数据库MySQL的中间件,主要提供了一个全面的数据库访问代理功能.Cetus ...
- DevExpress v18.1新版亮点——Windows 10 UWP篇
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress Windows 10 UWP v18.1 的新功能,快来下载 ...
- CUDA ---- Memory Model
Memory kernel性能高低是不能单纯的从warp的执行上来解释的.比如之前博文涉及到的,将block的维度设置为warp大小的一半会导致load efficiency降低,这个问题无法用war ...
- webpack 性能优化 -- 待续
文章 这篇文章挺不错的, 各方面优化都提到了, 有空研究下 文章 这个文章提出 , 增量打包用 webpack-watch 会让你打包速度飞快, react不参与打包, 不require, 而是放在 ...
- 多种数据库之间的同步工具SymmetricDS
代码:https://github.com/JumpMind/symmetric-ds 原理: 通过触发器模式同步时,是将数据库的变化记录到某个系统表中,然后在客户端建立缓冲,并定期将变化push到接 ...
- Osmocom-bb系统编译
Ubuntu 12.04.5 LTS i386环境下编译 sudu su --------------------------------------------------------------- ...
- C#实现Access导入导出Excel
一.Access从Excel中导入数据 .用到的Excel表的格式及内容 实现 [c-sharp] view plaincopyprint? OleDbConnection con = new Ole ...
- prop和state的区别
1.prop用于定义外部接口,state用于记录内部状态: 2.prop的赋值在外部世界使用组件时,state的赋值在组件内部: 3.组件不应该改变prop的值,但是state的存在目的就是让组件来改 ...
- 用于主题检测的临时日志(0ece3f5c-d74f-449c-85a7-ed53fffb0e94 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
这是一个未删除的临时日志.请手动删除它.(abf5973f-502f-47e6-8825-4dd1c2cdd799 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)