变量和基本类型

1、执行浮点运算选用double,以为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几,甚至某些机器上,双精度运算甚至比单精度的快。
2、当我们赋值无符号类型超过范围时,其结果为该类型表示数值的总数取模后的余数,例如

unsigned char a = -4 ;     //a的值为-4+256=252   

3、当我们赋值有符号类型超过范围时,其结果是无意义的,此时程序可能继续工作,也可能会崩溃,也有可能产生垃圾数据,例如

signed char a = 256 //此时a是无定义的

4、表达式中既有无符号的数字,又有带符号的数字是,会强制转换为无符号的数字。
5、减法运算带有强制的类型转换,例如:

unsigned char a = 40, b =10;
std::cout<<b-a<<endl;      //此时输出的结果为-30
signed char a = 40, b =10;
std::cout<<b-a<<endl;    //此时输出的结果为-30
unsigned int a = 40, b =10;
std::cout<<b-a<<endl;    //此时输出的结果为4294967266

这是因为减法运算会将unsigned char 或者signed char转换为int类型后进行减法操作,但是unsigned int不会进行强制转换,这一点很容易出错。
6、字符和字符串的区别,字符串包含结束符\0,同时是单引号和双引号的区别。
7、C++中初始化和赋值是两个完全不同的操作,初始化的含义是创建变量的时候赋予其一个初始值,复制的含义是把对象当前的值擦除,用一个新值替代。
8、变量初始化的方式有四种:

 int temp = 0; 
 int temp = {0};
 int temp = {0};
 int temp = (0);

其中第二种、第三种称作列表初始化,列表初始化时不能进行类型转换。
9、使用未初始化的变量可能会带来无法预计的后果,建议初始化每一个内置类型的变量。
10、extern关键字表示声明的含义,extern语句包含初始化值的情况下将不是声明,而是定义。

extern int i; //声明i而非定义
int i; //定义
extern int i = 2; //定义

变量只能定义一次,但是可以声明多次,尤其是分块编程的时候。
11、c++变量命名规范:

标识要能体现实际含义;
变量名一般用小写,例如index,不要使用Index或者INDEX;  
用户自定义的的类名一般以大写字母开头,例如Sale_item;  
如果标识由多个单词组成,则单词应有明显的区分,如student_loan studentLoan;  

最后,命名规范这件事,若能坚持,必将有效。
12、在对象第一次使用的地方附近定义它是一种较好的选择,这样有助于找到变量的定义,而且有助于赋给一个合适的初值。
13、如果函数有可能用到一个全局的变量,则最好不要再定义一个同名的局部变量。(是针对同一个名字在不同的作用域可能指向不同的实体的情况)
14、引用:引用为对象起另一个名字,引用必须初始化,初始值也必须为一个对象,同时类型应保持一致,而且引用本身不是一个对象,不能定义引用的引用。

int ival = 1024;
int &reival = ival;// 正确 引用
int &reval2;// 错误,引用必须初始化
double temp = 3.14;
int &retemp = temp;//错误,引用的类型必须保持一致

15、指针:指针本身就是一个对象,允许对指针进行赋值和拷贝,而且在指针的生命周期内能先后指向不同的对像。指针无需在定义的时候赋初值,如果指针没有被初始化,将拥有一个不确定的值。但是,使用未经初始化的指针是引发问题的重要原因,建议初始化所有的指针,并且在可能的情况下,尽量定义了对象之后在定义指向他的指针。如果实在不能确定指针指向何处,初始化为nullptr和0,然后在程序中每次使用指针前先进性判断,尽可能的减少错误的可能。
16、空指针的定义:

int  *p1 = nullptr;//
int  *p2 = 0;//
int  *p3 = NULL;

但是把int变量直接赋给指针是错误的操作,即使这个int变量的值等于0;

int zero = 0;
p1 = zero;//错误,不能讲int类型的变量直接赋给指针

17、因为引用不是一个实际的对象,故不能定义指向引用的指针;
18、指针的类型和它所指向的对象的类型需要严格的匹配;
19、指针定义的时候,和具体使用指针的时候有下面的区别:

int  pd =42; 
int  *p1 = pd; int *p1 =  &pd;//这两种定义的方式都正确 第一种 初始值是指向int对象的指针;第二种是初始值是int型对象的地址。
定义完之后,p1表示地址,*p1表示指向的对象,即pd;
*p1 = &pd//错误
为*p赋值实际是为p1所指向的对象复制,所以*解引用操作只适用于那些明确指向了对象的指针。

20 、int* p1 和 int p1 的作用是一样的,而且int 没有批量操作的作用,所以这两种写法只要坚持其中的一种即可,在接下来的博客中,均采用第二种方法。
21、距离变量名最近的符号对变量的类型有最直接的影响:

int p = 42;
int *p1 = &p;
int  **p2 =  &p1;//指向指针的指针
int  *&p3 = p1;//对一个指针的引用
p3 = &p;//p3引用了一个指针,因此可以将地址赋给p3
*p3 = 0; //将p3引用的指针解引用操作,再复制,就是p目前为0。