变量和基本类型一

  在文章开始之前得先强调一个关键概念:强静态类型。

  C++是一门静态类型语言,什么静态?对,就是它在编译时需要做类型检查。

  在大多数语言中,对象的类型限制了对象执行的操作。C++中,操作是否合法是在编译时检查。在编写表达式时,编译器检查表达式中的对象是否按该对象的类型定义的使用方式使用。若不是,则编译器会提示错误。

1.基本内置类型

 C++定义了一组表示整数,浮点数,单个字符和布尔值的算术类型,另外还定义了一种称为void的特殊类型。这些就是内置类型!

 

C++规定了每个算术类型的最小存储空间,但通常编译器使用的存储空间都他要求的要大。上图就是内置算术类型对应的最小要求空间。

1.1整型

 表示整数,字符和布尔值的类型合称为整型。而其中字符类型有两种:char和wchar_t。

 char通常是单机器字节,能够存储机器基本字符集中任何字符相应的数值。wchar_t是宽字符,用于扩展字符集,比如汉子,这些字符集中的一些字符不能用单个char表示。

1.1.1内置类型的机器级表示

  C++的内置类型与计算机的存储器中的表达方式紧密相关。计算机以位序列存储数据(例如:1010101011)。在位这一层次上,存储器已经没有结构和意义了。

  让存储具有结构的基本方法就是使用块(chunk)处理存储。这里就牵扯到了操作系统了。

块的位数一般是2的幂,通常将8位的块作为一个字节,32位作为一个“字”。

  计算机通常将存储器的每个字节和一个称为地址的数关联起来。对于一个8位字节和32位字的机器,他的存储器的字表示如下:

 

要让地址为736424的字节具有意义,就必须要知道存储在该地址的值得类型,知道了类型,就知道了表示该类型的值需要多少位和如何解释这些位。

 

  在《C++Primer》第四版中,short,int,long类型都表示整型值,存储空间的大小不同。32位机器中,short类型为半个字长,int类型为一个机器字长,long类型是一个机器字长。

知识补充:

机器字长:计算机能直接处理的二进制数据的位数(32位计算机,一个机器字长等于4字节)。

 

1.1.2带符号和无符号类型

  除了bool其他整型可以是带符号和不带符号的。Int,short,long都默认是signed,要获得不带符号的需加unsigned.

1.1.3整型的赋值

 这里我们讨论的是关于赋值越界的问题。当取超出范围的值赋给变量时,结果取决于这种类型是signed还是unsigned的。

  对于unsigned类型来说,编译器必须调整越界值使其满足要求。编译器会将该值对unsigned类型进行取模(如8位的unsigned char,若将456存储到8位的unsigned char中,实际赋值位200,因为200是456对256进行取模后的值)

  对于unsigned类型来说,负值总是越界。C++中,把负值赋给unsigned对象完全合法的,其结果是该负值对该类型的取值个数求模后的值。

  Eg:将-10赋给8位的unsigned char ,我们来计算,-10-[(-10)/256]*256,[(-10)/256]的计算结果是-1,然后与256相乘,于是-10-(-1)*256 = 246

1.2 字面值常量

  像13这样的值,在程序中被当成字面值敞亮,称之为字面值是因为只能用他的值称呼它,称之为常量是因他的值不能修改。

  注意:只有内置类型存在字面值,没有类类型的字面值。因此,也没有任何标准库类型的字面值

 1.2.1 整型字面值规则

  定义字面值整数常量可以使用以下三种进制中的任一种:十进制,八进制,十六进制。

  以0开头的字面值整数常量表示八进制,以0X0x开头的表示十六进制。字面值整数常量的默认类型为intlong。通常在数值后面加L或者l指定常量为long类型。类似,可通过在数值后面加U或者u定义unsigned类型。

  

1.2.2 浮点字面值规则

   默认的浮点字面值常量为double。在数值后面加上F或者表示精度。

1.2.3 非打印字符的转义序列

 

1.2.3 字符串字面值

  字符串字面值是一串常量字符。为了兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符("\0")。宽字符串在前面加”L”。

1.2.3 字符串字面值的连接

   两个相邻的仅由空格,制表符或者换行符分开的字符串字面值,可连接成一个字符串字面值(字符串和宽字符串连接的结果是未定义的)。

 

结果:

 

编程好习惯提示:

 定义长整型,应该使用大写字母L,小写字母l容易与数字1混淆。

2.变量

  在上一篇文章中我们提到了变量命名的一些好的编程习惯。这里我们来更详细地讨论讨论变量。

 2.1 什么是变量

  前面刚提到了C++是强静态类型,所以每个变量都有特定的类型。变量提供了程序操作的有名字的存储区。关于变量的定义就不多讲了(太简单了,如果不懂,就先看看书吧)在这里只说下C++的两种表达式(什么是表达式,后面的文章中我会专门细细探讨):左值和右值 

 1左值:左值可以出现在赋值语句的左边和右边

 2右值:右值只能出现在赋值的右边。

 变量是左值,数字字面值是右值(因此不能被赋值)

 2.2 变量命名

见上篇文章《注释与变量命名》

 2.3对象(变量)初始化

   C++支持两种初始化变量的形式:复制初始化和直接初始化。

  

 注意:

 C++中初始化并不是复制。初始化指创建变量并给他赋初始值,而赋值则是擦除对象的当前值并用新值代替。

 2.4对象(变量)初始化规则

  2.4.1内置类型变量的初始化

  内置类型变量是否初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体内定义的内置类型变量不进行自动初始化。

编程好习惯提示:

  每个内置类型的对象都要初始化,虽然这样做不是必须的,但是会更加容易和安全。,记住,永远不要依赖未定义行为。

  2.4.2类类型变量的初始化

  类可以通过一个或多个构造函数来控制类对象的初始化。若定义某个类的变量没有提供初始化式,这个类也可以定义初始化时的操作,则他是调用的默认构造函数来实现的。大部分类都提供默认构造函数。若不提供,则必须显示初始化变量

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值