2015 8 5 C 學習總結

2021-07-04 08:45:08 字數 3203 閱讀 2474

巨集定義:(簡單說句就是用其他的名字來代表一些可能會重複出現,或是繁瑣的東西)

無參巨集定義:

無參巨集定義的一般形式為:#define 識別符號 字串

其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。

例如: #define m (a+b) 它的作用是指定識別符號m來代替表示式(a+b)。在編寫源程式時,所有的(a+b)都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用(a+b)表示式去置換所有的巨集名m,然後再進行編譯。

程式1:

#include

#define m (x+y)

using namespace std;

int main()

對於巨集定義還要說明以下幾點:

1.巨集定義是用巨集名來表示乙個字串,在巨集展開時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集展開後的源程式時發現。

2.巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

3.巨集定義其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。  (有關#undef 請查閱其他資料)

有參巨集定義:

c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。

帶參巨集定義的一般形式為:  #define 巨集名(形參表) 字串

在字串中含有各個形參。 帶參巨集呼叫的一般形式為:  巨集名(形參表)

例如:#definem(y)((y)*(y)+3*(y))/*巨集定義*/

k=m(5);/*巨集呼叫*/

在巨集呼叫時,用實參5去代替形參y,經預處理巨集展開後的語句為:  k=5*5+3*5

程式2:

#include

#define m(x,y) x+y

using namespace std;

int main()

上例程式的第一行進行帶參巨集定義,用巨集名m表示條件表示式 x+y ,形參a,b均出現在條件表示式中。程式中 m(x,y)=m(a,b) 為巨集呼叫,實參a,b,將代換形參x,y。

初步了解斷點除錯:c/c++ code:

f9 —— 設定/取消斷點

f10 —— 單步執行

f11 —— 比f10的步幅小

f10在函式的呼叫時,直接跳過,在f11下,會進入函式體! 

f5 —— 執行到下乙個斷點!

了解除錯,首先要知道"斷點"這個概念。斷點就是程式執行中可能會中斷的地方,方便開發者在程式執行的過程中檢視

程式當前的執行狀態,比如變數的值,函式的返回值等等。究竟怎麼使用斷點呢?

1.f9在當前游標所在的行下斷點,如果當前行已經有斷點,則取消斷點。

f5除錯狀態執行程式,程式執行到有斷點的地方會停下來。

f10單步執行程式。

ctrl+f10執行到游標所在行。

f11和f10的區別是,如果當前執行語句是函式呼叫,則會進入函式裡面。

shift+f11跳出當前所在函式。

特別說明:

a.有的地方不能下斷點。比如空行,基本型別定義語句(不初始化),等等非執行語句。比如

int i; // 此行不能下斷點

int j=0;// 這裡可以下

cstring str;// 這裡可以下

intk = max(i,j);// 這裡可以下

b.不是所有斷點都會(斷)。比如下斷點的語句在程式裡面沒有被執行。

c.此外,alt+f9還可以下條件斷點,不過這個不常用,有興趣的可以自己研究

2.如何除錯release版的程式?

有些程式在debug下執行的很好,但在release下卻總是失敗,預設情況下release是不能除錯的。 怎麼解決呢?

其實"debug"和"release"都只是乙個代號而已,各自對應一組不同的編譯選項。

在release的預設設定下,alt+f7 ,調出工程設定對話方塊,切換到link選項卡,勾選"generate debug info",然後再切換

到c/c++選項卡,在"optimizations"裡面選"disable(debug)",在下面的"debug info"裡面選"program database for edit

and continue".然後點ok儲存設定,重新編譯程式,下斷點即可。

3.上面兩點已經能應付很多種情況了,但是有時候即使在debug下也不能下斷點,我以前也曾經遇到過這種問題,乙個

調了層的dll,就是不能下斷點。其實還除了上面的方法,還有一種最底層的實現技術:使用彙編。

細心的人可能會發現,有時候在除錯狀態下當程式出現異常的時候,游標會指向彙編**,而這個**就是int 3,這其

實是乙個中斷。

在你的**的任意地方加上

__asm

;用debug編譯,然後直接執行程式。當程式執行到上述**的時候,就會出現乙個框,告訴你說一大堆資訊,說程式錯

了,下面有"除錯"、"終止"、"忽略",不用理,點除錯就可以進入跟蹤了。

(bug與debug的由來:為馬克1號編制程式的是一位女數學家雷斯.霍波,有一天,她在除錯程式時出現故障,拆開繼電器後,發現有只飛蛾被夾扁在觸點中間,從而「卡」住了機器的執行。於是,霍波詼諧的把程式故障統稱為「臭蟲(bug)」,把排除程式故障叫debug,而這奇怪的「稱呼」,竟成為後來計算機領域的專業行話。)

初步了解二分法查詢:(具體感悟下次在發表)

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。主要思想是:(設查詢的陣列區間為array[low, high])(1)確定該期間的中間位置k(2)將查詢的值t與array[k]比較。若相等,查詢成功返回此位置;否則確定新的查詢區域,繼續二分查詢。區域確定如下:a.array[k]>t 由陣列的有序性可知array[k,k+1,……,high]>t;故新的區間為array[low,……,k-1]b.array[k]c++**:

#include

#define n 10

using namespace std;

int main()

if(a[mid]!=x)

printf("沒找到!\n");

else

printf("找到了,在第%d項裡",mid+1);

return 0;

}

2015 8 5陣列與指標練習總結

1 include2 3char str hello world 45char ptr str 陣列名只代表陣列元素的首位址,即str 0 的位址,6 故此處也可以這樣寫 char ptr str 0 78 void main 922 while str i 這樣寫也是能實現功能的,因為陣列名的實質...

C 學習總結

using system using system.collections.generic using system.text namespace helloworld class fraction class program console.writeline sum private static...

C 學習總結( )

1 based code 是為了向後相容用的。2 mfc提供的由cdialog派生的類 derived dialog class purpose ccolordialog 選擇顏色 cfiledialog 選擇檔名以開啟或儲存 cfindreplacedialog 查詢或替換對話方塊 cfontdi...