首頁技術(shù)文章正文

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

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

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

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

float f=3.5;

int n=6;

long k=21;

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

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

有符號數(shù)向無符號數(shù)轉(zhuǎn)換。

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

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) 用來定義帶參數(shù)的宏,已被C++的內(nèi)聯(lián)函數(shù)所代替。

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

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

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

for(int i=0;i

...

6、C++會把注釋當(dāng)做空格。

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'; //有些編譯器可以通過,但是結(jié)果不對的

//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、函數(shù)返回值,可以返回堆地址,也可以返回全局或靜態(tài)變量的地址,但是不能返回局部變量的地址。

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

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

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

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

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

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

int a[10];

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

引用本身不是一種數(shù)據(jù)類型(int&不是類型,定義時也不產(chǎn)生內(nèi)存空間),所以沒有引用的引用。也沒有引用的指針。引用是變量或?qū)ο蟮囊?,而不是類型的引用,所以有空指針,但是沒有空引用。

Int& ri=NULL //沒有意義

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

C++規(guī)定,臨時變量或?qū)ο蟮纳芷谠谝粋€完整的語句表達式結(jié)束后便宣告結(jié)束。所以如果以返回值初始化一個引用,應(yīng)當(dāng)先建立一個變量,將函數(shù)返回值賦于這個變量,作如下處理:

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

int& b=x;

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

float temp;

float& fn2(float r)

{

temp=10*r;

return temp;

}

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

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

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

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<


本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓(xùn)學(xué)院


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


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