一个char类型的大小和一个机器字节一样。char在实现的时候会是unsigned char和 signed char当中的一种,这与机器有关。
wchar_t,char16_t ,char32_t为国际化提供支持,这几种字符的字面值需要加前缀。
C++标准规定数据的宽度:short<=int<=long<=long long.
当unsigned int和int进行运算的时候,后者会被提升为前者,因为无符号数没有负数,所以负数被提升为无符号数会变成一个非常大的正数。
无符号数的0-1之后会得到巨大的正数,因此应该避免使用无符号数作为for循环的迭代变量,容易出现死循环。
同时应该避免混用有符号数和无符号数。
自动发生的类型转换:
一个无符号数被赋值了一个超过表示范围的数时会自动进行取模操作。把有符号数赋值给无符号数实际上就是把有符号数的字节序列解读为无符号数,-1的补码解读为无符号数会得到巨大的正数。
如果给一个带符号数赋值的一个超过范围的,那行为是未定义的。
通过给字面值指定前缀后缀可以指定字面值的类型和进制。
变量的初始化: 变量要求先声明后使用。只能被定义一次,可以声明无数次,声明的时候一旦进行初始化那就变成了定义。使用extern声明,声明是文件作用域。
内层作用域定义与外层作用域同名变量,外层会被内层的屏蔽。
引用出现的绝大多数地方都代表着引用的对象,最典型的是赋值、求表达式、取地址。
C++的定义是由数据类型和声明符构成的,在使用,分开的定义语句中,这些变量的数据类型是相同的,但是声明符是不一样的,所以可以定义出不一样的变量。
关于指针的const,重点理解:const char*p="sfsdf"和char * const pa={'a','\0} 和const char * const pb="sfsf".属于数据类型的一部分的那个const是会影响赋值和数据访问的,
而属于声明符的const作为右值的时候与没有const是一样的。
const默认只对文件内有效,要多文件使用,定义和声明的时候都要加extern。
类型别名:一种使用typedef,另一种是使用using。使用类型别名进行复合类型定义时,不能直接替换成原类型来理解(虽然作用可能一样),这个需要注意。
auto 通过初始值推导类型,对于数据类型的const不会忽略,对于属于声明符号的const会忽略。
decltype关键字:引用只有在这里作为引用类型,可以推断出&符号,别的情况引用的使用都与所指对象一样。decltype((variable))的结果永远都是一个引用。decltype的类型推导比较严格。很多时候都可以理解为是直接找到这个变量定义的地方,把定义的那一堆直接抄下来。