閱讀721 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Way on c & c++ 小記 [四]


關於自增運算符的進一步研究。

代碼:

#include<stdio.h>
 
int main(int argc,char*argv[]){
      int a,b;
      a = b = 0;
      b = ++a;
      b = a++;
      b++;
      a = a++;
      return 0;
}


反匯編後:

      b = ++a;
00000039 inc        dword ptr [ebp-0Ch]
0000003c mov        eax,dword ptr [ebp-0Ch]
0000003f mov        dword ptr [ebp-10h],eax
      b = a++;
00000042 mov        eax,dword ptr [ebp-0Ch]
00000045 mov        dword ptr [ebp-10h],eax
00000048 inc        dword ptr [ebp-0Ch]
      b++;
0000004b inc        dword ptr [ebp-10h]
      a = a++;
0000004e nop             
0000004f inc        dword ptr [ebp-0Ch]


2010-1-30

----------------------------------------cuttingline----------------------------------------


C中預處理與typedef概覽。

【目錄】

1.宏定義

2.文件包含

3.條件編譯

4. typedef

 

一、宏定義

預處理命令,包括文件包含和條件編譯,都是在預編譯時進行處理的;因為編譯器無法識別預處理命令,所以在編譯前,預處理命令已經處理完畢。預處理命令是ANSI C統一規定的,但是並不是C語言本身的組成,所以純粹的C編譯器是無法識別它們的。

個人總結宏定義有3個用途:

I 簡單的宏定義:#define A B

這個比較簡單,就是純粹的完全的替換

II 帶參數的宏定義:#define A(a,b) a+b

這點有點類似函數處理,不過函數是在運行時進行調用,而宏定義在編譯時便進行替換。前者時間花費在運行上的現場保護等,後者花費在預處理命令上的處理。

例子:

#include <stdio.h>

 

#define Add(a,b) a+b

 

int main(){

int c;

c = Add(2,3);

printf(“%d/n”,c);

return 0;

}

這一段代碼輸出5並進行換行。

III 得到多個結果的宏

有時候調用函數想返回多個值得使用數組或者指針,使用宏有時候可以簡單地“返回”多個值。

例子:

#include <stdio.h>

 

#define LenAndArea(l,s,a,b)l=(a+b)*2;s=a*b;

 

int main(){

int len,area;

LenAndArea(len,area,2,3);

printf(“%d/n%d/n”,len,area);

return 0;

}

這一段輸出10換行6換行

 

二、文件包含

C語言第一句一般都是#include<stdio.h>,所以一般久而久之就以為這是C語言的一部分了;然而很驚人的,嚴格來說這不是C語言本身的組成部分。

文件包含有兩種形式,一種是#includestdio.h”,表示要包含的文件從當前目錄下搜索,而#include <stdio.h>則表示從存放C庫函數頭文件的目錄搜索,為標準方式。

文件包含在編譯預處理時形成一個新的源文件,即將目標文件全部包含進來再進行編譯,形成.obj文件,再進行連接。

 

三、條件編譯

條件編譯給我的第一印象是類似於ThinkPHP的配置文件中設置了‘DEBUG_MODE => TRUE,為什麼呢?因為學習條件編譯的時候看到的就是用來控製進行跟蹤的輸出。

例子:

#include <stdio.h>

 

#define DEBUG

 

int main(){

#ifdef DEBUG

printf(“開啟了跟蹤/n”);

#endif

return 0;

}

當源文件中有多個跟蹤輸出的時候這樣使用方便許多。此外,在避免重複包含頭文件時也如此處理。

條件編譯格式:

#ifdef A

codehere…

#else

code

#endif

其中#else部分可以省略,隻要前文中有#defineA語句,甚至不需要對A進行具體定義標識,便會執行相應代碼部分。

類似的有#ifndef

條件編譯與if語句不同,條件編譯是在編譯階段選擇是否進行編譯,而if語句是程序運行階段的控製語句。

最後還有一種條件編譯,它根據表達式的值是否為真判斷是否進行編譯:

#if A

code1

#else

code2

#endif

如果A為真則編譯code1,否則編譯code2

 

四、Typedef

typedef不是預處理命令,它是在編譯時進行處理的。

使用typedef可以利於程序的通用性和可移植性。有的機器上int類型占用2個字節,而有的機器上int類型占用4個字節,此時的int就相當於long類型的數值範圍。為了便於移植,可以使用:

typedef int INT

typedef long INT

此外,使用typedef定義數組如下:

#include <stdio.h>

 

typedef int INTARR[10];

 

int main(){

INTARRa={1,2};

printf(“%d/n%d/n”,a[0],a[1]);

return0;

}

2010-2-4

----------------------------------------cuttingline----------------------------------------

 

最後更新:2017-04-02 04:01:46

  上一篇:go Linux背後的人
  下一篇:go Java EL係列-3.0.JUEL基本類