2、变量和基本类型

2、变量和基本类型

  • 1.算术类型
    • C++规定sizeof(int)>=sizeof(short),sizeof(long)>=sizeof(int),sizeof(long long)>sizeof(long),long long是C++11中新定义的
    • double比float扩展了精度值,计算代价相差无几甚至更快,long double基本没必要的且带来的耗时也不容忽视
    • 需要注意的是,char、signed char、unsigned char三者是不一样的,虽然char会表现为后两者之一,但具体是由编译器决定的
    • C++没有约定带符号的类型如何表示但约定了正值和负值的量应该平衡

    • 无法预知和依赖于实现环境的行为:无法预知的行为源于编译器无须(有时是不能)检测的错误,程序也应尽量避免依赖于实现环境的行为,如把int的尺寸看做是确定不变的,看下表。

      原文:https://sourceforge.net/p/predef/wiki/DataModels/

      Data type LP32 ILP32 LP64 LLP64 ILP64 SILP64
      char 8 8 8 8 8 8
      short 16 16 16 16 16 64
      int 16 32 32 32 64 64
      long 32 32 64 32 64 64
      long long 64 64 64 64
      pointer 32 32 64 64 64 64
    • 1.2.字面值常量
      • 如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则实际是一个整体。
      • 转义序列
        • \a,报警响铃符,\b,退格符,\f,进纸符,\v,纵向制表符
        • 泛化转义序列:\x后紧跟1个或多个十六进制数,或\后紧跟1/2/3个8进制数
      • 指定字面值类型:前缀(u/U/L/u8)、后缀(uU lL(long/long Double) fF llLL)
  • 2.变量

C++的每个变量都有类型,决定了所占空间大小和布局方式和能参与的运算

  • 变量的定义(下面4种初始化方式都是可以的)
    int a1 = 0;
    int a2 = {0};
    int a3{0};  //列表初始化,存在丢失风险时将报错
    int a4(0);
    
  • 变量声明和定义的关系
    • 声明规定类型和名字,定义还申请空间、赋值
      • 声明:由一个基本类型(base type)和一个声明符(declarator)列表组成
  • 2、复合类型
    • 2.1 引用:为对象起+ 90另外一个名字
      int ival = 1024;
      int &refVal = ival;
      
    • 2.2 指针,实现了对其他对象的间接引用
      • 空指针
        • :char *p1 = nullptr,*p2 = 0,*p3 = NULL;都可生成空指针
        • nullptr是一种特殊类型的字面值
        • NULL是预处理变量,和0一样
      • void *指针:可存放任意对象的地址
    • 2.3 复合类型申明

      变量定义:基本数据类型+一组声明符(类型修饰符)

      int i=0,*p=&i,&r=i; //一条定义语句,一个基本数据类型可定义出不同类型的变量

      • 指向指针的引用:引用不是对象,所以不能定义指向引用的指针,但指针是对象(从右向左读)

        int p,&r=p;//r是对指针p的引用

    • 2.4 const 限定符

      默认情况下,const对象仅在文件内有效,C++允许:对于connst变量不管是声明还是定义都加上extern关键字(gcc编译会报错)

      • const的引用:const int &r1 = ci;//不能修改绑定的对象
      • 引用的类型必须与其所引用的对象一致,except①初始化常量引用时允许用任意表达式做初始值 ②允许常量引用绑定非常量对象、字面值、表达式
      • 常量表达式:值不变,编译过程中能得到计算结果

        const int a = 1;//常量表达式

        int b = 1;//非常量表达式

        const int c = getSize();//非常量表达式(运行时才能获取值)

      • 可用constexpr修饰常量表达式
        • 指针必须被声明成nullptr或0
        • 函数体内定义的变量不存放在固定地址,不能用它修饰
        • const int *p = nullptr; //指向整型常量的指针
        • constexpr int *q = nullptr; //指向整数的常量指针,等效于 int *const q
    • 2.5 处理类型
      • 类型别名
        typedef char * pstring;
        const pstring p1 = 0;
        const char *p2 = 0;//注意这个类型和上面的不一样
        
      • auto类型说明符

        通过初始值推断变量的类型,会忽略顶层const,保留底层const

      • decltype类型指示符

        选择并返回操作数的数据类型(包括顶层const和引用在内)

    • 2.6 自定义数据结构
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章