zoukankan      html  css  js  c++  java
  • C++变量和基本类型

    1. 如何选择类型的准则
    1. 当明确知晓数值不可能为负的时候,应该选择无符号类型。
    2. 使用int执行整数运算的时候,在实际应用中,short常常显得太小而long一般和int有一样的尺寸,如果数值超过了int,那么就要用long long(ACM经常用)。
    3. 在算术表达的时候不要使用char或者bool,char在一些机器上是有符号的,而在另一些机器上又是无符号的。
    4. 执行浮点运算的时候应该选用double而不是float,双精度运算有时候会比单精度要快很多。

    2. 对于有符号和无符号整形转换的规则

    1. 当我们赋给带符号类型一个超出它表示范围的值的时候,结果是未定义的。(这是5e上的原话,但是事实上学了CSAPP以后这个值我们还是可以预计的)。
    2. 当我们赋给无符号类型一个超出它表达范围的值的时候,结果是初始值对无符号类型表示数值的总数取模后的余数。

    3. 字面值常量

    1. 严格来说,尽管整形字面值可以储存在带符号数据类型中,但严格来说,十进制字面值不会是负数,如果我们使用了一个形如-42的负十进制的字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
    2. 字符串一行写不了可以下一行再""开始写。
    3. 字符和字符串字面值
      u
      unicode16
      char16_t
      U
      unicode32
      char32_t
      L
      宽字符
      wchar_t
      u8
      UTF-8(仅用于字符串字面常量)
      ch
    4. 整形字面值
      u or U
      unsigned
      l or L(最好用L)
      long
      ll or LL
      long long
         5. 浮点型字面值
    f 或者F
    float
    l 或者L
    dong double
         6. 常量表达式和constexpr
          是指的是指不会改变并且在编译的过程中就能得到计算结果的表达式,显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式,要注意的是,如果一个const int被一个函数所赋值,那么它的值会在运行期间才会被识别出来,所以它也不是常量表达式。如果使用constexpr(C++11特性),初始化一个constexpr的变量则必须使用字面值或者constexpr函数来初始化。
           字面值类型包括:算术类型,引用,指针(注意指针和引用的初始值必须是nullptr或者是0(要注意必须是字面值0,而不是整形的0,整形的0并不是一个地址),或者是储存于某个固定地址的对象(一般指定义在函数体外的对象)),某些被定义为字面值常量的类,枚举类型。
     
    字面值常量的类必须满足
    a. 数据成员都是字面值类型,
    b. 类必须至少含有一个constexpr构造函数,
    c. 如果一个数据成员含有类内初始值,则内置类型成员的值必须是一条常量表达式,或者如果成员属于某种类类型,那么初始值必须使用成员自己的constexpr构造函   数来初始化。
    d. 类必须使用析构函数的默认定义,该成员负责销毁类的对象。constexpr构造函数体一般来说为空,比如constexpr FormatFile(int r): rank(r) {}(类内静态成员的类内初始化必须保证其是一个constexpr类型,要注意如果在类内定义了一个constexpr的值(必须初始化),则最好在类外也定义一下,但不能带初始值)。

    4. 变量(C++对象和变量是一个意思)
    1. 对象通常指一块能存储数据并且具有某种类型的内存空间。
    2. 如果使用列表初始化({ pram})来初始化变量,如果列表初始化存在丢失信息的风险,那么编译器就会报错,但是如果使用平常的( )或者=来初始化,那么就不会报错(比如从“__int64”转换到“int”需要收缩转换 ),只会警告。
    3. 要注意,整形一定不能给指针赋值,即使他本身的值为“0”,void*指针可以指向任意类型的内存,但不存在任何类型信息
    4. 复合类型包括指针和引用,也包括用户自定义类型,注意引用不是对象。但是指针是对象,所以存在对指针的引用,不存在对引用的指针。
    5. FormatFile test, *test2;
      FormatFile *&r = test2;
      r = &test;
         6.  要判断一个表达式是否为常量表达式,那么就要看他的值是否为运行时才能获得(典型:函数的返回值不是常量表达式)。
    5. 关于语法糖auto和decltype
    1. 要注意希望推断出来的auto类型是一个顶层const,那么就要明确指出const(要注意的是,auto只会忽略顶层const,如果一个变量是底层const,那么他就不会被忽略)。
    2. decltype(p) k = p;//如果p是int *const,则k也为int *const
    2. decltype和auto的最大不同的是,decltype返回顶层const和引用,在decltype中,对指针或者数组解引用,得到的是对应类型引用,而不是对应的类型,如果不解引用,得到的就是指针或者数组;如果表达式加上了一个括号,得到的还是引用。

    6. 其他
      1. C++的赋值和初始化并不是完全等同的,不能混为一谈。

      2. C++分离式编译:如果我们想声明一个变量而不是定义它,那么我们就在类型名的前面加上extern就可以了:
    int j;//声明了而且定义了(默认初始化)
    extern int i;//声明但是不定义
     
           如果我们一旦定义了i,那么extern的表达式就会转为一个定义,但是我们不能在函数体内部对extern变量进行定义。(变量可以被多次声明,但是可以被1多次定义)。
      3. 一定要注意,引用不是一个对象,我们不能创建一个指向引用的指针。但是我们可以创建一个指向引用的指针。写法:
    int i;
    int *p = &i;
    int *&r = p;

        注意指向引用的指针的写法,一定是解指针运算符在前面,然后引用运算符在后面。

     
     
     
  • 相关阅读:
    K8s PV and PVC and StorageClass
    WebSphere--WAS概念和原理解析
    K8S配置多集群访问
    ROS2学习日志:CV开发之关联Gazebo/Webots/ROS2
    CV学习日志:Orbslam使用总结
    CV学习日志:Basalt使用总结
    CV学习日志:Kalibr使用总结
    CV学习日志:CamOdoCalib使用总结
    CV学习日志:OpenVINS使用总结
    CV学习日志:搭建U2004开发环境
  • 原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/5812517.html
Copyright © 2011-2022 走看看