巨集定義:(簡單說句就是用其他的名字來代表一些可能會重複出現,或是繁瑣的東西)
無參巨集定義:
無參巨集定義的一般形式為:#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...