C++篇:第一章_变量和常量_知识点大全
C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器
注意:C++篇为本人手动将Word文档修改成Markdown格式(因为网上修改的方法都会出现较多错误),故格式可能有时会不太整齐请见谅,阅读时请务必主要内容前的编号
变量和常量
(一)标识符规则
- C++标识符具体规则如下:
① 第一个字符必须是字母或下划线;
② 后跟字母、下划线、或数字;
③ 标识符对大小写敏感;
④ 不能与c++保留字(即关键字)同名;
⑤ 标识符在C++中一般是32字符(根据不同系统对标识符长度的规定不同而改变)
- 一个标识符的作用域是程序中的一段区域,用于确定该标识符的可见性。当标识符在一段区域中可见时,就可以在该区域内使用此标识符。作用域有五种:
① 块作用域(局部作用域)
② 文件作用域(全局作用域):在函数和类之外说明的标识符具有文件作用域,其作用域从说明点开始,在文件结束处结束。 如果标识符出现在头文件的文件作用域中,则它的作用域扩展到嵌入了这个头文件的程序文件中 ,直到该程序文件结束,例如外部静态变量,外部变量和外部静态变量合称为全局变量或全程变量
③ 函数原型作用域
④ 函数作用域
⑤ 类作用域
(二)分隔符
- 空格,TAB,回车CR,换行LF,分号,括号,中括号,花括号,逗号,运算符(+,-,*,/...)都是c++语言里的分隔符(?不是分隔符)
(三)常量
常量分为六种:整型常量、实型常量、字符型常量、字符串常量、符号常量(define)、布尔常量
null是java中的写法。C/C++中的空是NULL
长双精度(long double)在GCC中占12字节,在Visual C++中占8字节
符号常量不能被赋值
(四)变量
任何全局变量都只能被定义它的程序文件中的函数访问 // 错误,因为如果函数定义在全局变量之前,则不能访问全局变量
全局变量和静态变量都是会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值
全局变量可用于函数之间传递数据
进行初始化即可自动获取初值为0的变量是全局变量和用static修饰的局部变量
已经定义过的全局变量 假如用引用头文件的方式引用,假如有两个cpp以上引用这个头文件就会出现重复定义,用extern引用 只是声明,不会分配内存,不会重复定义,所以用extern
extern只能用来声明已定义的外部变量,而不能用于变量的定义,只要看到extern,就可以判定这是变量声明,而不是定义变量的语句,例如对于int a而言既可以说是定义也可以说是声明
初始化变量的两种方法:
① int a = 0;// 这种写法,就是经典的C的写法,初始化a为零
② int a(0);// 这个是使用了构造函数写法的初始化,相当于定义一个int的对象,其初始化的传给构造函数的值为零
8.寄存器变量
① 寄存器变量只能是局部变量或函数的形式参数(因为寄存器变量属于动态存储方式)
② 寄存器变量只能为int型或char型
③ 寄存器变量不能进行取地址操作(因为寄存器是无地址的)
④ register只是一个建议型关键字(例inline),但即便没有请求成寄存器变量依然不能对他取地址,因为他已经被声明为register了
(五)转义字符
char a ='\82';把从转义符""开始后面的数字和转义符一起忽略,表示将最后一个字符’2’赋给变量a
\ooo和\xhh称为通用转义字符,其中ooo表示可以用1-3位八进制数表示一个ASCLL字符,hh表示可以用1-2位十六进制数作一个ASCLL字符(注:\9错误,\0xFE错误)
(六)类型声明
C++里大写TRUE和小写true区别 true是bool型的; TRUE是int(BOOL)型的(C++中无BOOL类型以及大写的TRUE)
![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps385A.tmp.jpg)
int和const int都是int类型
float a,b=&a;//a的类型是float,b的类型是float,&a的类型是float**。 b和&a类型不同不能进行赋值操作
C++声明double变量用小写的double
用到volatile关键字修饰变量的情况:(了解)
① 设备的硬件寄存器(如:状态寄存器),例对硬件寄存器进行操作
② 一个中断服务子程序中会访问到的非自动变量,例外部中断会改变变量
③ 多线程应用中被几个任务共享的变量,例外部任务会改变变量
④ java/C/C++中volatile关键字可以保证并发编程中的可见性和有序性
⑤ 一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它
⑥ 优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份
⑦ volatile适用于多线程应用中被几个任务共享的变量
7.浮点型常量的指数形式(科学记数法):以f e/E n格式组成浮点数,其中f可以是整数或小数,E/e表示以10为底的幂,n为指数且必须为整形,f和n不可或缺
对于十进制的浮点数整数和小数部分可以忽略其中之一
八进制开头一定要以数字0开头
null表示没有地址;null可以赋值给引用变量,不能将null赋给基本类型变量
int和char前面都可以加signed和unsigned修饰,如果指定为signed则以补码形式存放
C++的自定义数据类型: 类(class),结构体(struct),枚举(enum),共用体(union),typedef
(七)数据类型关键字
类型修饰符char,int,long,int,short都可以用unsigned修饰,但float,double,bool不能
如果指定为signed(有符号),则数值以补码形式存放,如果用unsigned,则数值没有符号,全部二进制位都用来表示数据本身
有符号时,存储的最大值为215-1(32767),最小值为—32768;无符号能存储的最大值为216-1(65535),最小为0
c++标准语法中是没有byte类型的,但有相似的类型char
(八)类型转换
- 类型转换分两种:
① 自动类型转换(隐式)
特点: 代码不需要进行特殊处理,自动完成
规则: 数据范围从小到大
安全性:安全
② 强制类型转换:
特点:代码需要进行特殊的格式处理,不能自动完成
格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据
安全性:不安全
将一个double型数据赋给float型时,要注意数值范围不能溢出,否则出现溢出错误
1. 三种强制类型转换表达式:
① static_cast(E)
基本类型之间的转换,但不能用于基本类型指针之间的类型转换(void指针和基本类型指针之间可以
用于有继承关系的子类与父类之间的指针或引用的转换
空类型指针转换为任意基本类型的指针
② const_cast
static_cast 不能将 const int* 转成 int*,const_cast 就可以,用法为 const_cast (expression)
const_cast<>里边的内容必须是引用或者指针,就连把 int 转成 int 都不行
③ reinterpret_cast
用法为 reinterpret_cast (expression)
type-id 必须是一个指针、引用、算术类型、函数针或者成员指针
可改变指针或引用的类型
将指针或引用转换为一个足够长度的整形
将整型转换为指针或引用类型
④ dynamic_cast
前面三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查
不能用于内置的基本数据类型的强制转换
dynamic_cast 要求 <> 内所描述的目标类型必须为指针或引用。dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 nullptr
在类的转换时,在类层次间进行上行转换(子类指针指向父类指针)时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换(父类指针转化为子类指针)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全
使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过(类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义)
表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针,如果可以,它返回一个新指针,甚至计算出为处理多继承的需要的必要的偏移量;此可以作为对象继承之间的转换
对于使用dynamic_cast进行基类和派生类之间的转换规则:向上转换一定成功,向下转换不一定成功。向下转换必须存在虚函数,不然编译错误
⑥ T(E)
⑦ (T)E
E代表运算表达式,T代表一个类型表达式
上述任一种都可以按自己意愿进行所需的类型强制转换
- ![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps386B.tmp.jpg)//横向的箭头表示必定的转换(float型在运算时一律先转换为double型),纵向箭头表示当运算对象为不同类型时转换方向
3. C++的基本数据类型之间的转换规则:char>short>int>unsigned->long->unsigned->long->float->double->long double
整数默认为int,大了会自动扩展到long和long long。 小数默认为double,精度提高会自动扩展到long double
将一个 int,short,long型数据赋给一个char型变量,只能将其低8位原封不动的送到char型变量(发生截断);将浮点型数据赋给整型变量,舍弃其小数部分
将double型数据赋给float变量时,截取前面7位有效数字存储到float变量;将float型数据赋给double变量时,数值不变,有效数字扩展到16位
int和float一定是在整型变量可输出字符的范围内才可以与字符数据互相转换
C++篇:第一章_变量和常量_知识点大全的更多相关文章
- 【C语言探索之旅】 第一部分第四课第一章:变量的世界之内存那档事
内容简介 1.课程大纲 2.第一部分第四课第一章:变量的世界之内存那档事 3.第一部分第四课第二章预告:变量的世界之声明变量 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答 ...
- iOS开发Swift篇—(二)变量和常量
iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...
- ASP.NET自定义控件组件开发 第一章 第三篇 第一章的完结篇
ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ...
- Java语言程序设计(基础篇)第一章
第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...
- 《Visual C# 从入门到精通》第一章使用变量、操作符和表达式——读书笔记
前言: 这个笔记是我个人总结,主要是熟练自己查看<Visual C# 从入门到精通>(第8版)这本书时,懵然起总结的想法,只是总结一些知识点,在工作项目会用得上,但是对毫无C#语言基础的, ...
- Go语言【第三篇】:Go变量和常量
Go语言变量 变量来源于数学,是计算机语言中能存储计算结果或能表示值抽象概念.变量可以通过变量名访问.Go语言变量名由字母.数字.下划线组成,其中首字母不能为数字,声明变量的一般形式是使用var关键字 ...
- 新手小白入门C语言第四章:变量与常量
C 变量 变量其实只不过是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和 ...
- Shell第一章《变量》
shell前言 什么是shell shell-'壳' 命令解释器,一种应用程序 shell语言特点 SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称. Shell本身是 ...
- 嵌入式学习笔记(综合提高篇 第一章) -- 利用串口点亮/关闭LED灯
1 前言 从踏入嵌入式行业到现在已经过去了4年多,参与开发过的产品不少,有交换机.光端机以及光纤收发器,停车场出入缴费系统,二维码扫码枪,智能指纹锁以及数字IC芯片开发等; 涉及产品中中既有 ...
- DirectX9:基础篇 第一章 初始化Direct3D
一.简介 二.Direct3D类 1.创建D3D类 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion); //Direct3D类的创建 IDirec ...
随机推荐
- 小景的Dba之路--如何导出0记录表以及数据泵的使用
小景最近在系统压测相关的工作,其中涉及了数据备份导出的操作.今天的问题是:exp命令不会导出0记录表,那么我们探讨下如何导出0记录表以及数据泵的使用. 首先,我们先刨析一下问题现象及原因: 在 Ora ...
- PTA乙级1039(C++)散列表解法
题目 1039 到底买不买 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖. 于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如 ...
- Python:基础&爬虫
Python:基础&爬虫 Python爬虫学习(网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另 ...
- P2951 [USACO09OPEN] Hide and Seek S 题解
Problem 题目概述 给你一个无向图,边权都为 \(1\) ,求:离 \(1\) 号点最远的点的编号.最远的距离.有几个点是离 \(1\) 号点最远的. 思路 直接用:优先队列 \(BFS\),先 ...
- 使用django 定时任务 (Django + celery + beat )
安装 django + celery + results https://www.cnblogs.com/lanheader/p/13615772.html 安装 django-celery-beat ...
- DX后台截图C++实现代码
DX后台截图C++实现代码 文章仅发布于https://www.cnblogs.com/Icys/p/DXGI.html和知乎上. 传统的GDI API (BitBlt)虽然可以完美的完成后台截图的任 ...
- ASM字节码操作类库(打开java语言世界通往字节码世界的大门)
前言:授人以鱼不如授人以渔,应用asm的文章有很多,简单demo的也很多,那么ASM都具备哪些能力呢?如何去学习编写ASM代码呢?什么样的情景需要用到ASM呢?让我们带着这些问题阅读这篇文章吧. 这里 ...
- 宏(define)与常量(const)
既然选择了远方,便只顾风雨兼程. 宏(define) 一. 宏的理解 宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则 ...
- JavaWeb项目练习(学生选课管理系统)三【登录功能】
需求: 首页为用户登录页面,管理员,教师,学生三种角色用户登录后,进入相应的功能页. 在index.jsp文件里跳转到login.jsp页面,为了更好地书写 <%@ page contentTy ...
- serdes 复制时钟
serdes复制时钟一般指的是,将rx lane的CDR 恢复时钟发送给TX/PLL, 这样rx和tx的时钟频偏就一致,在远端环回时经常用到.RX,TX时钟同频后环回数据就可以畅通发出去,否则RX/T ...