易错点总结

1,printf,cout 输出是从右往左压栈的。

 1 int main(){
 2     int b=3;
 3     int arr[]={6,7,8,9,10};
 4     int *ptr=arr;
 5     *(ptr++) += 123;   // 等同于  *ptr = *ptr+123; ptr=ptr++;  ptr++ : 先用 ptr,再将 ptr++ 
 6     cout<<*arr<<endl; 
 7     printf("%d,%d
",*ptr,*(++ptr)); //和下面输出相同,printf 计算参数时是从右往左压栈的; 
 8     cout<<*ptr<<*(++ptr)<<endl;  //输出顺序从右往左 ;同上 ,输出 8 8 
 9     return 0;
10 }

 2,类型转换。https://blog.csdn.net/gaoranfighting/article/details/44351831

 1 #include<iostream>
 2 #include<conio.h>
 3 
 4 using namespace std;
 5 
 6 int main(){
 7     float a = 1.0f;
 8     cout<<(int)a<<endl; //1
 9     cout<<&a<<endl;  // 0x70fe3c 
10     cout<<(int&)a<<endl; // 1065353216
11     cout<<boolalpha<<((int)a == (int&)a)<<endl; // false
12     
13     float b = 0.0f;  
14     cout<<(int)b<<endl; // 0
15     cout<<&b<<endl;  // 0x70fe38
16     cout<<(int&)b<<endl;  // 0
17     cout<<boolalpha<<((int)b == (int&)b)<<endl; // true
18     return 0;
19 } 

3,const 的不同位置产生的区别:https://blog.csdn.net/u010571660/article/details/9623973

一个比较经典的问题--问以下两种声明的区别:

1)const char* p

2)char* const p

3)char const *p

这里的 const 关键字是用于修饰常量,书上说 const 将修饰离它最近的对象,所以,以上两种声明的意思分别应该是:

1)p 是一个常量字符的指针,不变的是 char 的值,即该字符的值在定义时初始化后就不能改变。(const char)

2)p 是一个指向字符的常量指针,不变的是 p 的值,即该指针不能再指向别的。(const p)

3)p 是一个指针,指针保存的是  char 类型,const 修饰的仍然是 char, 因为 const 只能修饰变量,不能修饰 * ,所以不变的仍然是 char 的值;(等同于 1 )

如何记忆呢?

Bjarne 在他的 《The C++ Programming Language》里给过一个助记的方法--------“以 * 分界,把一个声明从右往左读”。

注意语法:* 读作 pointer to (指向...的指针),const (常量)是形容词,char (类型变量)和 p (变量名) 都是名词。

1)const char* p 读作:p is a pointer to a const char ; 译为:p 是一个指针(变量),它指向一个常量字符(const char);

2)char* const p 读作:p is a const pointer to a char ; 译为:p 是一个常量指针(const p),它指向一个字符(变量)。

注意:

先看 const int a 和 int const a ,这里没有分界符 * ,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数;

再看 const char* p 和 char const *p ,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char ,字符常量;

所有博文均为原著,如若转载,请注明出处!
原文地址:https://www.cnblogs.com/zpcoding/p/10314534.html