变量和基本类型

数据类型

还是常见的那几种,int,bool,char,double,float。
关键字有signed,unsigned。

值得注意的是,书中给出了编程时选择数据类型的几条建议

  • 当明确知道数值不为负,选择用无符号数
  • 使用int做整数运算(short一般太小,int和long一般大小一样,超过int范围,用long long)
  • 算数表达式不要使用char和bool,只有在用字符和bool时再用
  • 浮点数运算一般用double,原因是float精度时常不够,而double计算代价与float相差无几,某些机器甚至效率要优于float。

类型转化

还是一般情况,会导致数据的精度出现变化,另外有一些特例要了解一下。

  • 算数值给bool,初始值是0则为flase,否则为true
  • bool给算数值,初始为flase则为0,反之则为1
  • 给无符号类型赋值,超过范围,结果是对无符号总数取模后的余数
  • 给有符号类型赋值,超过范围,结果是undefined,程序的运行结果就比较危险了,无法预知
  • 不要混用带符号数和无符号数,带符号数会自动转成无符号数

字符串

"A"和'A'长度是不一样的,"A"编译器会在末尾加一个'\0'所以"A"长度比'A'多1。

变量

没什么好说的,变量类型加变量名就声明完成了例如

int X

X就是一个int变量。

变量命名规范

  • 能体现实际含义
  • 变量名一般用小写
  • 自定义的类名一般以大写字母开头
  • 若由多个单词组成,则单词间应该有明显区分

作用域

大多数作用域以花括号分割,一般有全局作用域和块作用域。

引用

是变量的别名

&d  

int ival = 2021;
int &refval = ival;

引用在被定义时必须被初始化

int &refival2;

这用用法是错误的

定义了引用之后,对它的操作都是在被绑定对象上进行的
引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起,另外引用和被绑定的值类型要一致。如:

int &ival=1;
double val1 = 1.0;
int &ival2 = val1;

是错误的

指针

指向另外一种类型的复合类型。
指针和引用的区别

  • 指针本身是一个对象,允许对指针赋值和拷贝
  • 指针无需在定义时赋初值。

声明方式

*d

int *ip1, *ip2;

指针存放对象的地址,要获得这个值,需要用取地址符 &
因为引用不是对象,没有实际地址,所以不能定义指向引用的指针

指针的值

一个指针应属于下列4种状态

  • 1.指向一个对象
  • 2.指向紧邻对象所占空间的下一个位置
  • 3.空指针
  • 4.无效指针

利用指针访问对象

若指针指向了一个对象,可以使用解引用符 * 访问该对象

空指针

如何获得空指针

int *n1 = nullptr;
int *n2 = 0;
int *n3 = NULL;

引用一经定义就不能再改变值,而指针可以。
只要指针非0,条件判断就位true
两个指针比较,如果存放的地址值相同则为true

void * 指针

可以存放任意对象的地址

如何看符合数据类型

int *&p;

一个对指针p的引用,p是什么看离p最近的符号。(ps,有就近原则那味道了)

const限定符

值不能变的变量(像java里的static),这种变量必须被初始化,默认状态下,const对象仅在文件内有效,若要多个文件共享,要在const前加extern

const引用(常量引用)

传引用不会新创建一个变量然后进行拷贝,而是直接传对象,速度快,同时保证了在函数内部无法对对象进行修改。
常量引用不能直接给普通引用赋值。
const引用只是限制了引用可参与的操作,而没有限制被引用的对象本身是不是一个常量。
这里的逻辑关系用王者荣耀里的概念替换可以理解为

众所周知,游戏里橘右京的别名是橘子
现在规定,可以通过别名查到英雄的信息
但是不能用别名修改英雄的信息

这里,橘右京是被引用的对象,橘子是一个引用,和别的玩家交流的时候,可以用橘子来简单代表橘右京,作了规定之后(就是添加了一个const修饰符)只能通过橘右京来修改它本身的英雄信息,不能通过橘子来修改。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容