要理解一個C 程序,僅僅理解組成該程序的符號是不夠的,我們還需要理解這些符號是如何組成聲明、表達式、語句和程序的。今天我們就來討論一下C語言中不一樣的語法結構。

1. 正確理解函數聲明
你是否見過這樣的代碼“(*(void(*)())0)();”,你能知道這是上麵意思嗎?
看不懂不用擔心,下麵我們來分析一下:任何C變量的聲明都由兩部分組成:類型以及一組類似表達式的聲明符(declarator)。聲明符從表麵上看魚表發揮有些類似,對他就隻應該返回一個聲明給定的結果。(void (*)()0)是將常數0 轉型為“指向返回值為void 的函數的指針”類型。而(*(void(*)())0)();就可以看成是一個函數調用,末尾的分號使得表達式成為一個語句。當然我們也可以使用typedef來世表達式更加清晰:
typedef void (*funcptr)();
(*(funcptr)0)();
2. 運算符的優先級問題
在 C語言中,運算符優先級有15個之多,如果不知道運算符的優先級我們在處理問題,分析代碼時,就非常被動,那麼我們可以對運算符進行簡單的分組,了解各組運算符之間的相對優先級,那麼記起來就相對簡單了,可以簡單的記做:!> 算術運算符 > 關係運算符>&&>|| > 賦值運算符。
3. 語句結束符的分號問題
C語言以分號“;”,作為語句結束的標誌,那麼如果在表達式後多寫了分號,會出現什麼結果呢?這個分號也許會被視作一個不會產生任何實際效果的空語句,或者編譯器會因為這個多餘的分號產生一條警告信息,可以根據警告信息去掉這個分號。但一個例外就是在if 或者while語句之後多寫一個分號,此時原來在if或者while之後的語句即使一條單獨的語句,魚條件判斷沒有了任何關係。請看一下代碼:
If(x > y)return;
If(x > y);return;
這兩句完全是不一樣的
4. Switch 語句問題
C語言中的switch,在case分支後都需要添加一個break;語句,不然會已知順著語句執行下去,達不到我們需要的效果。
5. 函數調用
與其他程序設計語言不同,C語言要求:在函數調用時及時函數不帶參數,也應該包含參數列表,因此,如果f 是一個函數,f();一個函數調用,而f;卻是一個什麼也不做的語句。
6. else 懸掛問題
我們經常聽到說else要和if 配對使用,然而在我們寫代碼時,還是會經常出錯,例如如下代碼:
這段代碼的本意是分為兩種情況,x 等於0 不等於0,然而上麵的代碼表達的意思卻截然不同。即 想不等於0,程序不做處理,x 等於0時,判斷y的值,做出不同的處理。
熱門課程
專業講師指導 快速擺脫技能困惑相關文章
多種教程 總有一個適合自己專業問題谘詢
你擔心的問題,火星幫你解答《黑神話:悟空》PS5遊戲版號已拿到!這幾個專業,未來真的賺到了!
一款像《黑神話:悟空》這樣的3A製作,其製作團隊一般需要遊戲策劃、原畫設計、3D美工、建模師、動畫師、UI製作、遊戲程序員等必要崗位。
今年回暖的行業不僅僅是動畫,像前麵提到的所有專業,如剪輯包裝、3D模型、角色動畫、虛幻視效、AI商業繪畫、虛幻開發、室內設計等......
騰訊遊戲美術春招已經啟動啦!25、26、27、28屆均有機會投遞,實習崗位有動畫、特效、3D場景/角色、2D場景/角色、技術美......
剛入學的同學,在第一次學到新軟件的時候,經常會被各種快捷鍵整懵。但是網上download的快捷鍵記憶圖,不一定就是合適的。這裏......
官方宣布3月共134款新遊戲版號過審,網傳68家遊戲公司超1000崗位
提前了解行業趨勢,關注熱門遊戲和新技術如AI、UE5等;或通過了解和參加線上、線下行業遊戲大賽或交流峰會,增加行業信息來源,積......
今天要分享的是武漢校區剪包專場招聘會,企業代表是曾就讀於武漢校區2210期的剪包學長,這次代表公司返校,招聘視頻拍攝剪輯崗位。