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;

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

 
 
 

C/C++: C++变量和基本类型的更多相关文章

  1. 再读《C++ Primer》——变量和基本类型

    刚上大学那时,几个室友一块买了本<C++ Primer>第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用.后来知道有第5版了,一直觉得内容差不多吧.直到最近,再读其中的一些内 ...

  2. C和指针 第三章 变量的储存类型 auto、static、register以及static关键词

    变量的储存类型决定标量何时创建,何时销毁以及他的值保持多久.有三个地方可以储存变量: 普通内存static 运行时堆栈auto 硬件寄存器register 变量的缺省储存类型取决于它的声明位置: 静态 ...

  3. C++ Primer 笔记(2)第二章 变量与基本类型

    第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...

  4. C++ Primer : 第二章:变量和基本类型(1)

    变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...

  5. C++ Primer 读书笔记 第2章 变量和基本类型

    C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...

  6. C++入门笔记(二)变量和基本类型

    变量和基本类型 一.基本内置类型 1.除去布尔类型和扩展的字符型外,其他整型可以分为带符号的和无符号的. 2.与其他整型不同,字符型被分为了三种:char.signed char 和 unsigned ...

  7. (C/C++学习笔记) 九. 变量的存储类型

    九. 变量的存储类型 ● 变量的存储类型(见附页) ● 注释 ①对于自动变量,它属于动态存储方式. 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式.由此看来,一个 ...

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

    变量和基本类型 不同平台下基本类型的字节数 类型 16位平台 32位平台 64位平台 char 1 1 1 short 2 2 2 int 2 4 4 long 4 4 8 long long / 8 ...

  9. C++ 学习笔记 变量和基本类型(一)

    C++ 学习笔记 一.变量和基本类型概述 类型是所有程序的基础.类型告诉我们数据代表什么意思以及可以对数据执行哪些操作. c++基本类型: 字符型 整型 浮点型 c++ 还提供了可用于自定义数据类型的 ...

  10. Chapter2(变量和基础类型)--C++Prime笔记

    数据类型选择的准则: ①当明确知晓数值不可能为负时,选用无符号类型. ②使用int执行整数运算.在实际应用中,short常常显得太小而long一般和int有一样的尺寸.如果运算范围超过int的表示范围 ...

随机推荐

  1. 国内git项目托管平台

    以前一直使用github托管项目,最近换了阿里云的vps,连接github出奇的慢,找了一下国内的代码托管平台. 有几个都不错,我刚好有csdn的账号,就试了一下csdn的托管平台,创建一个项目,发现 ...

  2. ViewStateMode vs EnableViewState

    What's the difference between: ViewStateMode: Disabled / Enabled / Inherit EnableViewState: True / F ...

  3. Spring中配置数据源的4种形式

    不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的数据源配置方式: spring自带的数据源(DriverManagerDataSource),DBCP数据源,C3P0数据源 ...

  4. 锋利的jquery-读书笔记(一)

    最近转职做前端,学了两个月目前学到jquery的部分,看的是<锋利的jquery>这本书,特地开了博客将自己学习过程中看到的一些知识做一个笔记. 第一章: 一.jQuery对象和DOM对象 ...

  5. [转]别再抱怨了,国内这么多优秀的Android资源你都知道吗?

    因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...

  6. OVGap iOS与Javascript交互(H5与原生APP交互)

    源代码:https://github.com/windshg/OVGap OVGap:一个轻量级的类库,能够让iOS应用和远程网页的 Javascript 代码进行通信,也就是说,远程的 Javasc ...

  7. 解决SmartGit序列号问题

    SmartGit过了30天试用期之后,就需要用户输入序列号才能继续使用,有一个办法可以跳过输入序列号. 一.windows+R  输入:%APPDATA%\syntevo\SmartGit 二.打开7 ...

  8. UNIX下的LD_PRELOAD环境变量

    UNIX下的LD_PRELOAD环境变量 也许这个话题并不新鲜,因为LD_PRELOAD所产生的问题由来已久.不过,在这里,我还是想讨论一下这个环境变量.因为这个环境变量所带来的安全问题非常严重,值得 ...

  9. 错误403,You don't have permission to access /index.html on this server.

    再更改apache工程路径时候,按照许多教程改了httpd.conf文件,还是不行,问题依旧存在 解决方式,你的个人文件夹的权限还没改好,看一下自己的个人文件夹的权限,是否可以读写

  10. IOS开发遇到(null)与<null>轻松处理

    在ios开发中不可避免的我们会遇到服务器返回的值有空值,但是如果是nil也就算了还可能得到(null)以及<null>的返回值,该如何处理呢?(当然有的字典转模型中已处理,可以通过遍历等) ...