c++primer:变量和基本类型详解
目录
- 前言
- 类型转换
- 变量声明与定义的关系
- 变量命名规范
- 复合类型
- 引用
- 指针
- const限定符
- const的引用
- 指针和const
- constexpr和常量表达式
- auto类型说明符
- decltype
- 头文件保护符
- 习题
- 练习
- 总结
前言
我只写我觉得重要的,同时把一些我觉得比较重要的习题做一下
类型转换
类型所能代表的范围决定了转换的过程
比如:当我们把一个非布尔类型的算数值赋给布尔类型时,初始值为0则代表结果为false,否则结果为true
当把浮点数赋给整数时,会舍去小数部分。
当赋给无符号整数的值大于它表示的范围时,结果是这个值对(无符号整数最大值+1)取模。
变量声明与定义的关系
变量声明规定了变量的类型和名字,在这一点上定义与之相同,但是除此之外,定义还申请存储空间,也可能为变量赋一个初始值。如果要声明一个变量而非定义它,则使用extern关键词,但是如果给extern修饰的变量初始化了,就抵消了extern的作用
变量命名规范
- 标识符体现具体含义
- 变量名一般用小写字母
- 用户自定义的类名一般用大写字母开头,如Sales_item
- 如果标识符由多个单词组成,则单词之间应该有明显区别,如student_loan或者studentLoan
复合类型
符合类型是基于基于其他类型定义的类型。
引用
引用为对象起了另一个名字,引用类型引用另一种类型通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名
引用不是对象,而是一个已经存在的对象的另一个别名
由于引用不是对象,所以不存在引用的引用
指针
指针本身就是个对象,允许对指针赋值和拷贝,指针无需在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将有一个不确定的值。
指针的值(即地址)应该属于下列4种状态之一
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针
- 无效指针(上述指针的其他情况)
*关于指向紧邻对象所占空间所占对象的下一个位置,说实话没太看懂,首先我在知乎查找了一下,然后又查看了一下英文版的c++ primer,发现其意思就是对象末尾的与其相邻的下一个位置,比如:
int t=5;int p=&t,则p+1就代表这个紧邻对象所占空间的下一个位置,但是这个对象没有定义,所以原则上是不能解引用的
const限定符
默认情况下,const 对象仅在文件内有效
const的引用
可以把引用绑定到const对象上去,就像绑定到其他对象上去一样,称之为对常量的引用,对常量的引用不能用来用作修改其绑定的对象,比如:
有const int a=3,const int &b=a则&b=34,int &c=b这种行为是不允许的,因为&b=34会改变对象的值,而此时是常量,而int &c=b若可以的话则能通过&c=34来改变对象的值,这显然是不能允许的。
引用所引用的类型与其所引用对象的类型一致
指针和const
由于指针本身就是个对象,因此指针本身是不是常量以及指针指向的对象是不是常量就是两个独立的问题。用顶层const(top-level const)代表指针本身是个常量,而用名词底层const(low-level const)代表指针指向的对象是个常量
constexpr和常量表达式
常量表达式(const expression)代表值不会改变并且在编译过程中就能得到计算结果的表达式。
例子:
const int max_files=20 //是常量表达式
const limit =max_files+1//limit是常量表达式
int ret=20//不是常量表达式,因为其值会改变
const int sa=get_size()//不是常量表达式,因为其值需要到运行期间得到
常量表达式是由它的数据类型和初始值来决定的
c++11新规定允许将变量声明为constexpr类型以便由编译器来验证变量是否为常量表达式,声明为constexpr的变量一定是一个常量,而且必须由常量表达式初始化 例:constexpr int sa=20
在constexpr限定符种如果定义了一个指针,限定符constexpr仅对指针有效,对指针指向的对象无关
auto类型说明符
其作用是让编译器去分析表达式的类型,例:auto a=a1+a2,编译器会自动将a的类型转换成a1+a2结果的类型。
decltype
其作用是得出表达式的类型 例:decltype(f()) sum=y,sum的类型就是f()返回值的类型
如果表达式的类型是解引用操作,则decltype将得到引用类型,因为解引用操作能给得到指针所指向的对象,并且能改变对象的值,所以是引用
如果decltype使用一个不加括号的变量则得到的结果是该变量的类型,如果使用一个加括号的变量,则得到的结果是引用类型,因为加了括号就代表这个变量是一个表达式,而变量是作为左值的特殊表达式,所以是引用
头文件保护符
#ifdef 当且仅当变量已定义时为真,#ifndef当且仅当变量未定义时为真,一旦检查得到为真则一直运行直到遇到#endif为止
习题
练习读程序写结果
unsigned int u=10,u2=42;
std::cout<<u2-u<<std::endl;//32
std::cout<<u-u2<<std::endl;//4294967264,其结果逻辑上是-32但是超出了其范围0-4294967295需要对4294967296取模得到4294967264
练习
下列那些初始化是正确的
- int i=-1,&r=0;//错误,0为字面值常量,需要常量引用
- int *const p2=&i2;//正确
- const int i=-1,&r=0;//正确
- const int *const p3=&i2;//正确
- const int *p1=&i2;//正确
- const int &const r2;//错误,因为引用不是对象,不能用const修饰
- const int i2=i,&r=i;//正确
总结
本片文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!