變數命名 Gcc編譯 運算子基礎

2021-09-27 09:20:33 字數 3405 閱讀 3108

1.變數名不能以數字開頭,否則語法錯誤;

2.不能以關鍵字作為變數名,否則語法錯誤;

3.變數命名時需要表達出變數含義;為了使變數名有意義,通常情況下我們使用英文取名方式;

4.可以使用下劃線開頭:通常情況下為了區分兩個含義非常接近的變數就會為其中乙個用下劃線開頭。通常將系統中存在的賬號用下劃線開頭(登入賬號密碼時);

5.當我們想為擁有復合含義的資料宣告的變數的時候,例如張三的身高,李四的體重:

①:駝峰命名法:int zhangsanheightcm =180;

②:下劃線命名:int lisi_weight_kg = 100;

兩種方法都可以,但在同一程式中不要混合出現;

共分為四個流程:gcc可以選擇階段性編譯

假設需要編譯的檔名為demo.c

1.預處理階段: gcc -e demo.c -o demo.i

①:標頭檔案展開

使用函式之前,也必須對函式進行宣告;在過往的使用printf函式的程式中,printf函式的宣告在stdio.h這個標頭檔案中,標頭檔案在預處理階段會被gcc展開,就是將標頭檔案中的所有內容複製貼上到當前**中。

②:簡單巨集替換

什麼是巨集:巨集即乙個替換指令,即變身,=。

巨集的寫法:#define 巨集名 被替換的內容

參與編譯的是目標內容,若出現語法錯誤,錯誤在於被替換的內容,注意給巨集的內容加括號,注意優先順序問題。

還有一種巨集叫帶參巨集,它可以將傳入的引數替換成與該引數有聯絡的其他形式,

如#define f(x) (x)*(x)

與巨集定義類似,系統中還有另乙個define,即型別宣告typedef,專門為乙個資料型別取乙個別名,typedef int io;

typedef與define的區別:

一:define是條指令,無視語法正確與否;typedef是條語句,需要保證語法正確;

二:define什麼都能換,typedef只能替換資料型別;

三:define實際參與編輯的是目標內容,typedef實際參與編譯的是別名

typedef long long int lli;

lli e = 30;

人為規定所有的巨集必須全部大寫,為了讓讀**的人能區分出這個單詞是個變數還是個巨集

③:去注釋

一:行注釋:"//",能夠將當前行全部設定為注釋

二:段注釋:"/** */",能夠將/ **/裡的內容全設定為注釋,gcc預處理的時候將注釋全部刪除,不參與編譯

④:上標記

為每一行**標記上原始檔的實際位置,以便debug時找到實際位置

2.編譯階段:gcc -s demo.i -o demo.s 將預處理好的檔案編譯成彙編檔案

也可以 gcc -s demo.c -o demo.s將原始檔編譯成彙編檔案

編譯過程是整個gcc中最重要的過程,它會判斷**中的詞義、語義即語法,所有的語法錯誤會在這一步被體現。

彙編檔案是直接操作記憶體的語句

3.彙編階段

gcc -c demo.s -o demo.o將彙編檔案匯編成二進位制檔案

或gcc -c demo.c -o demo.o

4.鏈結階段:gcc demo.o -o demo將demo.o鏈結上動態庫與靜態庫,形成可執行檔案demo

我們可以簡單的發現從二進位制檔案到可執行檔案,他們都是二進位制檔案,但是可執行檔案卻比二進位制檔案大出很多,大出來的部分就是動態庫與靜態庫:存放了標準庫函式的可執行檔案的二進位制檔案。

分析:所有的庫函式,都會被編譯到二進位制檔案階段,形成.o檔案,然後庫檔案就可以包含龐大數量的.o檔案。注:這裡只會鏈結標準動態庫與靜態庫,如果乙個函式不在標準動態庫或靜態庫中,則此時需要手動鏈結該函式的庫,使用:-l+庫名(-lm即-l math)以硬鏈結的方式鏈結

在宣告語句中表示資料型別,放在位址前表示取值。取一次*,少乙個*

使用指標的目的在於訪問值,相當於乙個鏈結,即更改此值與之相連的值也更改了。

乙個指標無論指向多大的記憶體空間,它只能指向該段記憶體的首位址。乙個位元組乙個位址,指標是模組化取值(根據資料型別確定一次性取位元組的大小)。例:

乙個int四個位元組,乙個指向int型的指標儲存的是首位址(共四個位址),*p時一次性取4個位址(即模組化取值)

單目、雙目、三目

有多少物件參與運算就有多少目

1.算數運算子:+ - * / %

/:就是除法運算中的取商,除數不能為0(否則浮點不存在,核心已轉儲)

%:除法運算中的取餘,兩個參與運算的資料必須是整型(對浮點型資料進行強制型別轉換(int))

能看成表示式都看成表示式

資料型別不同但可相容取精度高的

2.賦值運算子= += -= …,賦值運算子不構成表示式,等號右側必須可讀,等號左側必須可寫;左值運算右值後寫入左值。由於賦值運算子優先順序最低,所以,先計算右邊再賦值給左邊。常量不可寫,表示式也不可寫,即只能作為右值。

計算機判斷標準:以0判斷為假,非0判斷為真;

計算機用來表述真假的標準:0表達為假,1表達為真。

3.比較運算子》,<,>=,<=,==,!=

關於浮點型資料的比較,注意確認精度等級,尤其在是否相等時。

例如:double a =3.14,b=3.14;

判斷浮點型是否相等的正確方式:(a-b > -0.0000001) && (a -b < 0.0000001)

4.自增運算子++ – 右結合,把值賦給表示式

int a =2,b=3;

a+++b+++a++ (a++ + b++ + a++); a+++b+b++(a++ +b + b++)注:++的優先順序高於+,++是單目,+是雙目運算子。

2+3+3+4=a=12,b=4

5×(12+4+4)=b=100 a=13

5.邏輯運算子:與&&、或||、非!, !的優先順序最高, && 與 ||處於同一優先順序,*的優先順序低於++,高於邏輯運算子,除去括號,最高優先順序是.和->

6.三目運算子:( ? : ) ascii碼中10表示\n換行,13表示\r回車把游標移至行首

7.位運算子

①:按位與 & :每一位都為1結果為1,只要有0結果為0

②:按位或 |

③:按位取反(單目)~: chmod中,開啟許可權用|(開燈),關閉許可權(關燈)用& ~r(取反與)

例:chmod u-w demo.c

0000 0111 0000 0111

0000 0100 1111 1011 0000 0011

④:按位異或 ^(要按補碼運算):不同為1,相同為0;0與任何數異或等於本身,1與任何數異或使之翻轉。

⑤:左移、右移 << , >>: 1<<2,二進位制中向左移動2位 (二進位制左移一位乘以2,右移一位除以2)

優點:算數運算子的效率是最高的,中間變數法的效率較低因為要開闢記憶體。

中間變數法的優點:安全、穩定。

周志航定理(異或三角定理也稱為一家三口定理):a異或(^)b得到c,這三個數稱為異或三角數,其中任意兩個數異或得到第三個數。

Python基礎 變數和運算子

目錄 序言 這一章我們將學習變數以及常見的型別,我們將以案例和 相結合的方式進行梳理,但是其中所有的案例和知識點 都是python3 版本。此外python還支援多種運算子,下表大致按照優先順序從高到低的順序列出了所有的運算子,我們會陸續使用到它們。運算子描述 下標,切片 指數 按位取反,正負號 乘...

PHP基礎 運算子 算術運算子 位運算子

1 將強制轉換為數字作加法運算 例 a 33 b 45.0 echo a b a b gettype a b 2 將強制轉換為數字作減法運算 例 a 33 b 45 echo a b a b gettype a b a 33.70 b 45.00 echo a b a b gettype a b 3...

變數與運算子

注釋 1.注釋 用於一行 2.注釋 三個單引號中間的均為注釋,可跨行 3.注釋 三個雙引號中間的均為注釋,可跨行 input 從外部獲取變數的值 eg age input 請輸入使用者年齡 print age age 等待輸入 處於阻塞狀態 輸入的內容儲存在age裡 python資料型別 1.num...