C/C++教程

C++篇:第一章_变量和常量_知识点大全

本文主要是介绍C++篇:第一章_变量和常量_知识点大全,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  • C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器

变量和常量

标识符规则

  1. C++标识符具体规则如下:

① 第一个字符必须是字母或下划线;

② 后跟字母、下划线、或数字;

③ 标识符对大小写敏感;

④ 不能与c++保留字(即关键字)同名;

⑤ 标识符在C++中一般是32字符(根据不同系统对标识符长度的规定不同而改变)

  1. 一个标识符的作用域是程序中的一段区域,用于确定该标识符的可见性。当标识符在一段区域中可见时,就可以在该区域内使用此标识符。作用域有五种:

① 块作用域(局部作用域)

② 文件作用域(全局作用域):在函数和类之外说明的标识符具有文件作用域,其作用域从说明点开始,在文件结束处结束。 如果标识符出现在头文件的文件作用域中,则它的作用域扩展到嵌入了这个头文件的程序文件中 ,直到该程序文件结束,例如外部静态变量,外部变量和外部静态变量合称为全局变量或全程变量

③ 函数原型作用域

④ 函数作用域

⑤ 类作用域  

(二)分隔符

  1. 空格,TAB,回车CR,换行LF,分号,括号,中括号,花括号,逗号,运算符(+,-,*,/...)都是c++语言里的分隔符(?不是分隔符)

(三)常量

  1. 常量分为六种:整型常量、实型常量、字符型常量、字符串常量、符号常量(define)、布尔常量

  2. null是java中的写法。C/C++中的空是NULL

  3. 长双精度(long double)在GCC中占12字节,在Visual C++中占8字节

  4. 符号常量不能被赋值

(四)变量

  1. 任何全局变量都只能被定义它的程序文件中的函数访问 // 错误,因为如果函数定义在全局变量之前,则不能访问全局变量

  2. 全局变量和静态变量都是会自动初始化为0,堆和栈中的局部变量不会初始化而拥有不可预测的值

  3. 全局变量可用于函数之间传递数据

  4. 进行初始化即可自动获取初值为0的变量是全局变量和用static修饰的局部变量

  5. 已经定义过的全局变量 假如用引用头文件的方式引用,假如有两个cpp以上引用这个头文件就会出现重复定义,用extern引用 只是声明,不会分配内存,不会重复定义,所以用extern

  6. extern只能用来声明已定义的外部变量,而不能用于变量的定义,只要看到extern,就可以判定这是变量声明,而不是定义变量的语句,例如对于int a而言既可以说是定义也可以说是声明

  7. 初始化变量的两种方法:

① int a = 0;// 这种写法,就是经典的C的写法,初始化a为零

② int a(0);// 这个是使用了构造函数写法的初始化,相当于定义一个int的对象,其初始化的传给构造函数的值为零

​ 8.寄存器变量

① 寄存器变量只能是局部变量或函数的形式参数(因为寄存器变量属于动态存储方式)

② 寄存器变量只能为int型或char型

③ 寄存器变量不能进行取地址操作(因为寄存器是无地址的)

④ register只是一个建议型关键字(例inline),但即便没有请求成寄存器变量依然不能对他取地址,因为他已经被声明为register了

(五)转义字符

  1. char a ='\82';把从转义符""开始后面的数字和转义符一起忽略,表示将最后一个字符’2’赋给变量a

  2. \ooo和\xhh称为通用转义字符,其中ooo表示可以用1-3位八进制数表示一个ASCLL字符,hh表示可以用1-2位十六进制数作一个ASCLL字符(注:\9错误,\0xFE错误)

(六)类型声明

  1. C++里大写TRUE和小写true区别 true是bool型的; TRUE是int(BOOL)型的(C++中无BOOL类型以及大写的TRUE)

  2. ![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps385A.tmp.jpg)

  3. int和const int都是int类型

  4. float a,b=&a;//a的类型是float,b的类型是float,&a的类型是float**。 b和&a类型不同不能进行赋值操作

  5. C++声明double变量用小写的double

  6. 用到volatile关键字修饰变量的情况:(了解)

① 设备的硬件寄存器(如:状态寄存器),例对硬件寄存器进行操作

② 一个中断服务子程序中会访问到的非自动变量,例外部中断会改变变量

③ 多线程应用中被几个任务共享的变量,例外部任务会改变变量

④ java/C/C++中volatile关键字可以保证并发编程中的可见性和有序性

⑤ 一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它

⑥ 优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

⑦ volatile适用于多线程应用中被几个任务共享的变量

​ 7.浮点型常量的指数形式(科学记数法):以f e/E n格式组成浮点数,其中f可以是整数或小数,E/e表示以10为底的幂,n为指数且必须为整形,f和n不可或缺

  1. 对于十进制的浮点数整数和小数部分可以忽略其中之一

  2. 八进制开头一定要以数字0开头

  3. null表示没有地址;null可以赋值给引用变量,不能将null赋给基本类型变量

  4. int和char前面都可以加signed和unsigned修饰,如果指定为signed则以补码形式存放

  5. C++的自定义数据类型: 类(class),结构体(struct),枚举(enum),共用体(union),typedef

(七)数据类型关键字

  1. 类型修饰符char,int,long,int,short都可以用unsigned修饰,但float,double,bool不能

  2. 如果指定为signed(有符号),则数值以补码形式存放,如果用unsigned,则数值没有符号,全部二进制位都用来表示数据本身

  3. 有符号时,存储的最大值为215-1(32767),最小值为—32768;无符号能存储的最大值为216-1(65535),最小为0

  4. c++标准语法中是没有byte类型的,但有相似的类型char

类型转换

  1. 类型转换分两种:

① 自动类型转换(隐式)

特点: 代码不需要进行特殊处理,自动完成

规则: 数据范围从小到大

安全性:安全

② 强制类型转换:

特点:代码需要进行特殊的格式处理,不能自动完成

格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据

安全性:不安全

将一个double型数据赋给float型时,要注意数值范围不能溢出,否则出现溢出错误

1. 三种强制类型转换表达式:

① static_cast(E)

  1. 基本类型之间的转换,但不能用于基本类型指针之间的类型转换(void指针和基本类型指针之间可以

  2. 用于有继承关系的子类与父类之间的指针或引用的转换

  3. 空类型指针转换为任意基本类型的指针

② const_cast

  1. static_cast 不能将 const int* 转成 int*,const_cast 就可以,用法为 const_cast (expression)

  2. const_cast<>里边的内容必须是引用或者指针,就连把 int 转成 int 都不行

③ reinterpret_cast

  1. 用法为 reinterpret_cast (expression)

  2. type-id 必须是一个指针、引用、算术类型、函数针或者成员指针

  3. 可改变指针或引用的类型

  4. 将指针或引用转换为一个足够长度的整形

  5. 将整型转换为指针或引用类型

④ dynamic_cast

  1. 前面三种都是编译时完成的,dynamic_cast 是运行时处理的,运行时要进行类型检查

  2. 不能用于内置的基本数据类型的强制转换

  3. dynamic_cast 要求 <> 内所描述的目标类型必须为指针或引用。dynamic_cast 转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回 nullptr

  4. 在类的转换时,在类层次间进行上行转换(子类指针指向父类指针)时,dynamic_cast 和 static_cast 的效果是一样的。在进行下行转换(父类指针转化为子类指针)时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全

  5. 使用 dynamic_cast 进行转换的,基类中一定要有虚函数,否则编译不通过(类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义)

  6. 表达式dynamic_cast<T*>(a) 将a值转换为类型为T的对象指针。如果类型T不是a的某个基类型,该操作将返回一个空指针,如果可以,它返回一个新指针,甚至计算出为处理多继承的需要的必要的偏移量;此可以作为对象继承之间的转换

  7. 对于使用dynamic_cast进行基类和派生类之间的转换规则:向上转换一定成功,向下转换不一定成功。向下转换必须存在虚函数,不然编译错误

⑥ T(E)

⑦ (T)E

  1. E代表运算表达式,T代表一个类型表达式

  2. 上述任一种都可以按自己意愿进行所需的类型强制转换

  1. ![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

  1. 整数默认为int,大了会自动扩展到long和long long。 小数默认为double,精度提高会自动扩展到long double

  2. 将一个 int,short,long型数据赋给一个char型变量,只能将其低8位原封不动的送到char型变量(发生截断);将浮点型数据赋给整型变量,舍弃其小数部分

  3. 将double型数据赋给float变量时,截取前面7位有效数字存储到float变量;将float型数据赋给double变量时,数值不变,有效数字扩展到16位

  4. int和float一定是在整型变量可输出字符的范围内才可以与字符数据互相转换

这篇关于C++篇:第一章_变量和常量_知识点大全的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!