教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

C++培訓之語法中的“六大陷阱”

更新時間:2016年07月21日17時46分 來源:傳智播客C/C++學科 瀏覽次數(shù):

的“大陷阱”
要理解一個C 程序,僅僅理解組成該程序的符號是不夠的,我們還需要理解這些符號是如何組成聲明、表達式、語句和程序的。今天我們就來討論一下不一樣的語法結構。
1. 正確理解函數(shù)聲明
你是否見過這樣的代碼“(*(void(*)())0)();”,你能知道這是上面意思嗎?看不懂不用擔心,下面我們來分析一下:任何C變量的聲明都由兩部分組成:類型以及一組類似表達式的聲明符(declarator)。聲明符從表面上看魚表發(fā)揮有些類似,對他就只應該返回一個聲明給定的結果。(void (*)()0)是將常數(shù)0 轉型為“指向返回值為void 的函數(shù)的指針”類型。而(*(void(*)())0)();就可以看成是一個函數(shù)調用,末尾的分號使得表達式成為一個語句。當然我們也可以使用typedef 來世表達式更加清晰:
typedef void (*funcptr)();
(*(funcptr)0)();
2. 運算符的優(yōu)先級問題
在 C語言中,運算符優(yōu)先級有15個之多,如果不知道運算符的優(yōu)先級我們在處理問題,分析代碼時,就非常被動,那么我們可以對運算符進行簡單的分組,了解各組運算符之間的相對優(yōu)先級,那么記起來就相對簡單了,可以簡單的記做:!> 算術運算符 > 關系運算符>&& >|| > 賦值運算符。
3. 語句結束符的分號問題
C語言以分號“;”,作為語句結束的標志,那么如果在表達式后多寫了分號,會出現(xiàn)什么結果呢?這個分號也許會被視作一個不會產生任何實際效果的空語句,或者編譯器會因為這個多余的分號產生一條警告信息,可以根據(jù)警告信息去掉這個分號。但一個例外就是在if 或者while語句之后多寫一個分號,此時原來在if 或者while之后的語句即使一條單獨的語句,魚條件判斷沒有了任何關系。請看一下代碼:
If(x > y)
return;
If(x > y);
return;
While(n > 0)
{
n--;
sum =+ n;
}
While(n > 0);
{
n--;
sum =+ n;
}
左右的代碼,就因為一個分號的差別,產生截然不同的效果。
4. Switch 語句問題
C語言中的switch,在case分支后都需要添加一個break;語句,不然會已知順著語句執(zhí)行下去,達不到我們需要的效果。
5. 函數(shù)調用
與其他程序設計語言不同,C語言要求:在函數(shù)調用時及時函數(shù)不帶參數(shù),也應該包含參數(shù)列表,因此,如果f 是一個函數(shù),f();一個函數(shù)調用,而f;卻是一個什么也不做的語句。
6. else 懸掛問題
我們經常聽到說else要和if 配對使用,然而在我們寫代碼時,還是會經常出錯,例如如下代碼:
if(x == 0){
if (y == 0)  error();
else{
z = x + y;
f(&z);
}
}
這段代碼的本意是分為兩種情況,x 等于0 不等于0,然而上面的代碼表達的意思卻截然不同。即 想不等于0,程序不做處理,x 等于0時,判斷y的值,做出不同的處理。

本文版權歸傳智播客C++培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓學院
首發(fā):http://fskzgqt.cn/c/
0 分享到:
和我們在線交談!