C++ primer 学习笔记(第二章:变量和基本类型)

来源:互联网 发布:盗贼源码解压密码 编辑:程序博客网 时间:2024/05/29 17:36

2.1基本内置类型

     C++定义了一套包括算术类型空类型在内的基本数据类型

     2.1.1、算术类型

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


C++:算术类型类型含义最小尺寸bool布尔类型未定义char字符8位wchar_t宽字节16位char16_tUnicode字符16位char32_tUnicode字符32位short短整型16位int整型16位long长整型32位long long长整型64位float 单精度浮点数6位有效数字double双精度浮点数10位有效数字long double扩展精度浮点数10位有效数字           布尔类型(bool)的取值是真(true)或者假(false)。

        基本字符是char,扩展字符集有:wchar_t,char16_t,char32_t,wchar_t。

C++规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。long long是C++11中的最新特性。

浮点型可以表示单精度、双精度和扩展精度值。C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。

     带符号类型和无符号类型:

       出去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。 

       带符号类型可以表示正数、负数或0,类型int、short、long和long long都是带符号的;无符号类型则仅能表示大于等于0的值,通常是在类型的前面加上unsigned,这样就可以得到无符号类型的值。

      与其他类型不一样的是char型,被分为三种:char、signed char、unsigned char。特别值得注意的是:char和signed char并不一样。尽管是字符的表现形式却只有两种:带符号和无符号。具体使用哪种形式有编译器决定。

   

    2.1.2、类型转换

        当程序的某处我们使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。

类型所能表示的值的范围决定了转换的过程:

              1、当我们把一个非布尔类型的算术值赋值给布尔类型时,初始值为0则结果为false,否则结果为true。

              2、当我们把一个布尔类型的赋给非布尔类型时,初识值为false则结果为0,初始值为true则结果为1.

              3、当我们把一个浮点数赋给整数类型时,进行近似处理。结果值将仅保留浮点数中小数点之前的部分。

              4、当我们把一个整数赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。

              5、当我们赋给无符号类型一个超出它表示的范围的值时,结果是初识值对无符号类型表示数值总数取模后的余数。

              6、当我们赋给带符号类型一个超出它表示的值时,结果是未定义的(undefined)。此时程序可能继续工作、可能崩溃、可能生成垃圾数据。

     

     2.1.3、字面值常量

        一个形如42的值被称作字面值常量

        整型和浮点型的字面值常量

            以0开头的代表八进制数,以0X开头的带表十六进制数,例如:以下几种形式都表示数值是20

                   20 十进制数    024 八进制数   0x14  十六进制数

            如果我们使用一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。

            浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:

                        3.14159   3.14159E0  0.   0e0  .001

        字符和字符串字面值

            单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串类型字面值。

            编译器在每个字符串的结尾处添加了一个空字符(‘\0’)

        转义序列

            C++转义序列包括:

                        换行符 \n            横向制表符 \t            报警(响铃)符 \a            纵向制表符 \v            退格符 \b            双引号 \"

                        反斜线 \\             问号 \?                         单引号 \'                              回车符 \r                     进纸符 \f

       指定字面值的类型

                        L‘a’     u8“hi!”  42ULL   1E-3F    3.14158L   

字符和字符串字面值前缀含义类型uUnicode16字符char16_tUUnicode32字符char32_tL宽字符wchar_tu8UTF-8(仅用于字符串字面常量)char

整型字面值后缀最小匹配类型u or Uunsignedl orLlongll or LLlong long浮点型字面值后缀类型f或Ffloatl或Llong double

       布尔字面值和指针字面值
              true和false是布尔类型的字面值。
              nullptr是指针的字面值。

2.2、变量
       变量提供了一个具名的、可供操作的存储空间。
       2.2.1、变量定义
        变量定义的形式:首先是类型说明符(type specific),随后紧跟由一个或者多个变量名组成的列表,其中变量名以逗号隔开,最后以分号结束。       
            例如: int sum = 0, value;
           初识值:
                   当对象在创建的时获得了一个特定的值,我们说这个对象被初识化。
           列表初识化:
                C++11引入了一个新的初始化方式,称为初始化列表(List Initialize),具体的初始化方式如下
                     int j = {0};
                     int j{0}  ;
              初始化列表不允许隐式的转换,例如:
                 
  1. long double ld = 3.1415926536;  
  2. int a{ld}, b = {ld}; //出错,不允许出现精度的丢失  
  3. int c(ld), d = ld; // 非列表初始化,但是会出现精度的丢失  
            默认初始化
                  如果定义变量时没有指定初值,则变量将被默认初始化
                 一种例外的情况,定义在函数体内的内置类型变量将不被初识化
       2.2.2、变量声明和定义的关系
                 声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。
                 定义(definition)负责创建与名字关联的实体。
                 变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝对不能重复定义。
        2.2.3、标识符
                标识符由字母、数字和下划线组成,其中必须要以字母和下划线开头。标识符的长度没有限制,但是对大小字母敏感。
                变量命名规范:
                    1、标识符要能体现实际含义。
                    2、变量名一般用小写字母。
                    3、用户自定义的类名一般以大写字母开头。
                    4、如果标识符由多个单词组成,则单词间应该明显区分。
          2.2.4、名字的作用域
                    作用域(scope)是程序的一部分,在其中名字有其特定的含义。c++语言中大多数作用域都是以花括号分隔。
                    作用域能彼此包含,被包含的作用称为内层作用域,包含着别的作用域的作用域称为外层作用域

2.3、复合类型
         复合类型(compound type)是指基于其他类型定义的类型。
         2.3.1、引用
                   引用(reference)为对象起了另外一个名字,引用类型引用(refer to)另外一种类型。定义引用的时候,程序会把引用和它的初始值绑定在在一起,而不是将初始值拷贝给引用。
                    注意:1、引用一旦被初始化完成,引用将和它的初始值对象一直绑定在一起。
                                 2、由于无法令引用重新绑定到另外一个对象,因此引用必须初始化。
                                 3、引用类型的初始值必须是一个对象
         2.3.2、指针
                   指针(pointer)是“指向(point to)”另外一种类型的复合类型,与引用类似,指针也是实现了对其他对象的间接访问。
                   指针与引用的不同点:
                                   1、指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个同的对象。
                                   2、指针无须在定义时赋初值
                   指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&)
                   指针的值(即地址)应属下列4种状态之一:
                                    1、指向一个对象
                                    2、指向紧邻对象所占空间的下一个位置
                                    3、空指针,意味着指针没有指向任何对象
                                    4、无效指针,也就是上述情况之外的其他值
                   如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问对象。
                   void*是一种特殊的指针类型,可用来存放任意对象的地址。

2.4、const 限定符
            const限定符是使定义的一个变量,它的值不能被改变。默认状态下,const对象仅在文件内有效
            const的引用:可以绑定到const对象上,就像绑定到其他的对象上一样,我们称之为对常量的引用。     
            初始化和对const的引用:引用的类型必须与其所引用的对象类型一致。
            对const的引用可能引用一个并非const的对象。
           指针和const:顶层const表示指针本身是个常量;底层const表示指针所指的对象是一个常量。
           常量表达式是指值不会改变并且在编译过程中就能得到计算结果的表达式。在c++11新标准中规定,允许将变量声明为constexpr类型以便于编译器来验证变量的值是否是一个常量。在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

2.5处理类型
          类型别名是一个名字,它是某种类型的同义词。
          有两种方法定义类型别名:1、使用关键字typedef:typedef double wages;
                                                               2、使用别名声明:using SI=Sales_item;
          auto类型说明符:用它就能让编译器替我们去分析表达式所属的类型,auto定义的变量必须初识化。
          decltype类型指示符
0 0
原创粉丝点击