Bootstrap

C++基础:变量和基本类型

目录

 

基本内置类型

一、基本内置类型

二、算术类型

三、类型转换

四、字面值常量

变量

一、变量

二、变量定义

三、变量声明和定义的关系

四、标识符

五、名字的作用域

复合类型

一、复合类型

二、引用

三、指针

四、理解复合类型的声明

const限定符

一、const限定符

二、const的引用

三、指针和const

四、顶层const 

五、constexpr和常量表达式

处理类型

一、类型别名

二、auto类型说明符


基本内置类型

一、基本内置类型

       C++定义了一套包括算术类型(arithmetic type) 和空类型(void) 在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的是,当函数不返回任何值时使用空类型作为返回类型。

二、算术类型

       算术类型分为两类:整型(integral type,包括字符布尔类型在内)和浮点型

带符号类型和无符号类型
       除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)无符号的(unsigned) 两种。带符号类型可以表示正数、负数或0无符号类型则仅能表示大于等于0的值
       类型int、short、 long 和long long 都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。 类型unsigned int 可以缩写为unsigned。
       与其他整型不同,字符型被分为了三种: char、signed char和unsigned char。特别需要注意的是:类型char和类型signed char并不一样。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。

建议:如何选择类型

       和C语言一样,C++的设计准则之一也是尽可能地接近硬件。C++的算术类型必须满足各种硬件特质,所以它们常常显得繁杂而令人不知所措。事实上,大多数程序员能够(也应该)对数据类型的使用做出限定从而简化选择的过程。以下是选择类型的一些经验准则:

  • 当明确知晓数值不可能为负时,选用无符号类型
  • 使用int执行整数运算。在实际应用中,short常常显得太小而long一般和int有一样的尺寸。如果你的数值超过了int的表示范围,选用long long
  • 算术表达式中不要使用 char或bool只有在存放字符或布尔值时才使用它们。因为类型char在一些机器上是有符号的,而在另一些机器上又是无符号的,所以如果使用char进行运算特别容易出问题。如果你需要使用一个不大的整数,那么明确指定它的类型是signed char 或者unsigned char。
  • 执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。事实上,对于某些机器来说,双精度运算甚至比单精度还快。long double 提供的精度在一般情况下是没有必要的,况且它带来的运行时消耗也不容忽视。

三、类型转换

       对象的类型定义了对象能包含的数据和能参与的运算,其中- -种运算被大多数类型支持,就是将对象从一-种给定的类型转换(convert)为另一种相关类型。

  • 当我们把一个非布尔类型的算术值赋给布尔类型时初始值为0则结果为false,否则结果为true
  • 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。
  • 当我们把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
  • 当我们把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
  • 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,8比特大小的unsigned char 可以表示0至255区间内的值,如果我们赋了一个区间以外的值,则实际的结果是该值对256取模后所得的余数。因此,把-1赋给8比特大小的unsigned char 所得的结果是255。
  • 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined)。此时,程序可能继续工作、可能崩溃,也可能生成垃圾数据。
     

提示:切勿混用带符号类型和无符号类型
        如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为带符号数会自动地转换成无符号数。例如,在一个形如a*b的式子中,如果a=-1,b=1,而且a和b都是int,则表达式的值显然为-1。然而,如果a是int,而b是unsigned,则结果须视在当前机器上int所占位数而定。在我们的环境里,结果是4294967295。

四、字面值常量

       一个形如42的值被称作字面值常量(literal),这样的值一望而知。每个字面值常量都对应一种数据类型, 字面值常量的形式和值决定了它的数据类型。
1、整型和浮点型字面值
       我们可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。例如,我们能用下面的任意一种形式来表示数值20:
                                                   20 /*十进制*/                     024/*八进制*/                      0x14 /* 十六进制*/

2、字符和字符串字面值
       由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值
                                                            'a'    //字符字面值                     "Hello World!" // 字符串字面值

3、转义序列

4、指定字面值的类型
通过添加如下表中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。

       对于一个整型字面值来说,我们能分别指定它是否带符号以及占用多少空间。如果后缀中有U,则该字面值属于无符号类型,也就是说,以U为后缀的十进制数、八进制数或十六进制数都将从unsigned int、unsigned long和unsigned long long中选择能匹配的空间最小的一个作为其数据类型。如果后缀中有L,则字面值的类型至少是long;如果后缀中有LL,则字面值的类型将是long long和unsigned long long中的一种。显然我们可以将U与L或LL合在一起使用。例如,以UL为后缀的字面值的数据类型将根据具体数值情况或者取unsigned long,或者取unsigned long long。

  • L' a'            //宽字符型字面值,类型是wchar_ t
  • u8"hi!"        // utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
  • 42ULL        //无符号整型字面值,类型是unsigned long long
  • 1E- 3F        //单精度浮点型字面值,类型是float
  • 3.14159L    //扩展精度浮点型字面值,类型是long double

5、布尔字面值和指针字面值

true和false是布尔类型的字面值:bool test = false;

nullptr是指针字面值。

变量

一、变量

       变量提供一个具名的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式、该空间能存储的值的范围,以及变量能参与的运算。对C++程序员来说,“变量(variable)” 和“对象( object)”一般可以互换使用。

二、变量定义

☆ 注意:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。
1、列表初始化
       C++语言定义了初始化的好几种不同形式,这也是初始化问题复杂性的一个体现。 例如,要想定义一个名为units_ sold 的int变量并初始化为0,以下的4条语句都可以做到这一点:

;