• C/C++基础----变量和基本类型


    变量和基本类型

    不同平台下基本类型的字节数

    类型

    16位平台

    32位平台

    64位平台

    char

    1

    1

    1

    short

    2

    2

    2

    int

    2

    4

    4

    long

    4

    4

    8

    long long

    /

    8

    8

    指针

    2

    4

    8

    float

    4

    4

    4

    double

    8

    8

    8

    类型的最小尺寸

    类型

    含义

    最小尺寸

    bool

    布尔类型

    未定义

    char

    字符

    8位

    wchar_t

    宽字符

    16位

    char16_t

    Unicode字符

    16位

    char32_t

    Unicode字符

    32位

    short

    短整型

    16位

    int

    整型

    16位

    long

    长整型

    32

    long long

    长整型

    64

    float

    单精度浮点数

    6位有效数字

    double

    双精度浮点数

    10位有效数字

    long double

    扩展双精度浮点数

    10位有效数字

    数据类型选择的经验准则

    • 当知晓数值不可能为负时,选用无符号类型
    • 使用int执行整数运算,short常常太小,long和int一般尺寸一样。如果int不够,用long long。

    • 在算数表达式中不要使用char或bool,使用char特别容易出问题。如果要使用一个不大的整数,那么明确执行为signed char或unsigned char。

    • 执行浮点数运算用double,float通常进度不够而且两者计算代价相差无几。Long double一般没有必要,且消耗不容忽视。

    有符号类型和无符号类型

    • 无符号类型赋值超出其范围,结果是取模后的值。如unsigned char c = -1;  //假设char占8bit,c的值为255
    • 有符号类型赋值超出其范围,结果未定义。如signed char c2 = 256;  //假设char占8bit,c2的值未定义
    • 切勿混用带符号类型和无符号类型。
    • 算数表达式中既有无符号数又有带符号数,带符号的数会转换成无符号的数

    指定字面值的类型

    字符和字符串字面值

    前缀

    含义

    类型

    u

    Unicode16字符

    char16_t

    U

    Unicode32字符

    char32_t

    L

    宽字符

    wchar_t

    u8

    UTF-8(仅用于字符串字面常量)

    char

    整型字面值

    浮点字面值

    u or U

    unsigned

    f or F

    float

    l or L

    long

    l or L

    long double

    ll or LL

    long long

     

     

    初始化与赋值

    初始化和赋值是两个完全不同的操作

    • 定义于函数体(块作用域)内的内置类型的对象如果没有初始化,则其值未定义。养成初始化内置变量的习惯。
    • 类的对象如果没有显式地初始化,则其值由类确定。

    声明与定义

    • 声明使得一个名字为程序所知,定义会申请存储空间,还可能为其赋初始值
    • (分离式编译)

      如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量
    • 对于复杂的声明语句,可以从变量名从右往左理解

    指针

    • 常见错误:解引用无效指针(空指针或已释放的指针)
    • 建议:初始化所有指针,并且尽量等定义了对象之后再定义指向它的指针。
    • 推荐nullptr而非0,0指针具有二义性。

    const和constexpr

    • const对象默认在文件内有效,当多个文件出现了同名const变量,等同于不同文件中定义了独立的变量。

      如果想不同文件之间共享const,则不管在声明还是定义中都添加extern关键字。

    • 顶层const表示本身是个常量,底层const表示指针指向的对象是一个常量。

    • 执行对象拷贝操作时,顶层const不受影响,底层const却不容忽视

    常量表达式:值不会改变且在编译阶段就能计算结果的表达式。

    • 复杂系统中很难分辨初始化是不是常量表达式,C11允许声明为constexpr由编译器来验证
    • 尽管指针和引用可以定义成constexpr,其初始值受到严格的限制。constexpr指针的初始值必须是nullptr或者0,或者是储存于某个固定地址中的对象。储存于函数体之外的对象其地址固定不变,能用来初始化constexpr指针。

    auto与decltype

    • auto一般会忽略掉顶层const,同时保留底层const。
    • decltype的表达式是一个变量,则decltype返回该变量的类型,包括顶层const和引用在内。

    • decltype如使用的表达式不是一个变量,则返回表达式结果对应的类型。
    • 如表达式是解引用操作,则得到引用类型。

    • 如果是加了双层括号的变量,则结果永远是引用。

    预处理变量无视C++中关于作用域的规则

  • 相关阅读:
    Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
    终于有人把“TCC分布式事务”实现原理讲明白了
    Java synchronized 关键字的实现原理
    Synchronized的实现原理(汇总)
    Spring的Bean的生命周期(大众版)
    Synchronized与Lock的区别与应用场景
    Lock与synchronized 的区别
    线程的同步控制synchronized和lock的对比和区别
    lock和synchronized的同步区别与选择
    Mybatis3.x与Spring4.x整合
  • 原文地址:https://www.cnblogs.com/logchen/p/9439774.html
Copyright © 2020-2023  润新知