首頁技術文章正文

C/C++技術:容易犯錯的知識點(一)

更新時間:2017-11-30 來源:黑馬程序員 瀏覽量:

1、賦值構成一個表達式,具有值,其值為賦值符左邊表達式的值。表達式和語句的一個重要區(qū)別是,表達式有值,而語句沒有值。

2、隱式類型轉換總是朝著表達數據能力更強的方向,并且轉換總是逐個運算符進行的。如

float f=3.5;

int n=6;

long k=21;

double ss=f*n+k/2;//在計算ss時,首先將f和n轉換成double,算得21,然后計算k/2得10,再將10(long int)轉換成double,最后得31。

27、C++基礎筆記(一) - EdwardLewis - 墨涵天地

有符號數向無符號數轉換。

3、當又有聲明又有定義時,定義中不允許出現默認參數,如果函數只有定義,才允許默認參數出現在定義中。默認值可以是一個全局變量,全局常量,或是一個函數,但是不能是局部變量,因為默認參數的函數調用是在編譯時確定的,而局部變量的位置和值在編譯時是無法確定的。如

int a=1;

void fun()

{

int i;

void g(int x=i); //not right

int g(int x=a); //right

}

4、define宏定義指令

1) 使用其定義常量已被C++中的const定義語句所代替。

2) 用來定義帶參數的宏,已被C++的內聯函數所代替。

3) 其一個有效的使用是在條件編譯中。

5、編譯時必須知道數組的大小。如

int a[]={1,2,3,4,5};//編譯器會自動去數

for(int i=0;i

...

6、C++會把注釋當做空格。

7、Free和malloc

int* a;

a=(int*)malloc(sizeof(int));

cout<

free((void*)a);

int* b;

b=(int*)malloc(12*sizeof(int));

cout<

指向常量的指針常量:具有上述兩具指針的特點,須在定義時初始化,且一旦賦值,則以后該指針的值將不會再發(fā)生變化,且通過指針不能改變所指向的變量的值,形如const int* const cpc="perfect";注意,這種情況下,*cpc的值也是不能改變的,如*cpc=n是不對的。

int main()

{

char* const pc="abcd";

cout<

cout<<*pc<

//*pc='b'; //有些編譯器可以通過,但是結果不對的

//cout<

const char* const cpc="perfect";

cout<

cout<<*cpc<

*cpc='n';//not right

cout<

return 1;

}

9、sum(int array[],int n)與sum(int* array,int n)是等價的。

10、函數返回值,可以返回堆地址,也可以返回全局或靜態(tài)變量的地址,但是不能返回局部變量的地址。

11、void指針是空類型指針,它不指任何類型,它僅僅是一個地址,不能進行指針運算,也不能進行間接引用。

NULL與void* 是不同的概念,NULL是一個指針值,任何類型的指針都可賦予該值。而void* 是一種類型(語法上是一個類型,本質上不是,沒有任何一個變量或對象,其類型為void),是一種無任何類型的指針。不允許對void進行引用。

12、由引號(" ")標識,但不是用來初始化數組的字符串,是字符串常量,如cout<<"hello"<

由于字符串常量的地址屬性,兩個同樣字符組成的字符串常量是不相等的, 字符串常量的比較是地址的比較。

字符串常量,字符數組名(常量指針),字符指針均屬于同一種數據類型。

13、不能建立引用的數組,因為數組是某個數據類型的集合,數組名表示起始地址,它不是數據類型。如

int a[10];

int& a1[10]=a; //not right

引用本身不是一種數據類型(int&不是類型,定義時也不產生內存空間),所以沒有引用的引用。也沒有引用的指針。引用是變量或對象的引用,而不是類型的引用,所以有空指針,但是沒有空引用。

Int& ri=NULL //沒有意義

可以用引用返回值。在通常情況下,C++會建立一個臨時變量以將函數返回值帶回。但是如果用引用,則不用建立臨時變量。

C++規(guī)定,臨時變量或對象的生命周期在一個完整的語句表達式結束后便宣告結束。所以如果以返回值初始化一個引用,應當先建立一個變量,將函數返回值賦于這個變量,作如下處理:

int x=fn1(5.0); //在這一句后臨時變量生命周期將結束

int& b=x;

*************************

float temp;

float& fn2(float r)

{

temp=10*r;

return temp;

}

用如上的方法,則函數返回值將不再創(chuàng)建臨時變量,而直接與全局變量temp共享內存單元

*******************************

以引用的初始化,可以是變量,也以是常量,也可以是一定類型的堆空間變量,但是引用不是指針,如下表達是不對的:

int& a=new int(2); //not right

下面是用堆空間變量初始化引用的一個例子:

#include

#include

using namespace std;

int main()

{

double* pd=new double;

if(pd==NULL)

{printf("failed");exit(1);}

cout<


本文版權歸黑馬程序員C/C++學院所有,歡迎轉載,轉載請注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓學院


首發(fā):http://c.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!