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
 
#define Add(a,b) a+b
 
int main(){
int c;
c = Add(2,3);
printf(“%d/n”,c);
return 0;
}
このコードは5を出力して改行します.
III複数の結果を得るマクロ
呼び出し関数は、配列またはポインタを使用する価値のある複数の値を返したい場合があります.マクロを使用すると、複数の値を簡単に「返す」ことができます.
例:
#include
 
#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、だから普通は長い間これがC言語の一部だと思っていました;しかし驚くべきことに、厳密にはC言語自体の構成部分ではありません.
ファイルには2つの形式がある、1つは#include"stdio.h"であり、含むファイルが現在のディレクトリから検索され、#includeは、Cライブラリの関数ヘッダファイルが格納されているディレクトリから検索することを示し、標準的な方法である.
ファイルは、コンパイル前処理時に形成する新しいソースファイルを含み、ターゲットファイルを全て含むコンパイルして形成する.objファイル、接続します.
 
三、条件コンパイル
条件コンパイルの第一印象はThinkPHPのようなプロファイルに『DEBUG_MODE’=>TRUE、なぜですか?学習条件のコンパイル時に見られるのは,追跡を行う出力を制御するためである.
例:
#include
 
#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が真であればcode 1をコンパイルし、そうでなければcode 2をコンパイルする.
 
四、Typedef
typedefは前処理コマンドではなく、コンパイル時に処理されます.
typedefの使用は、プログラムの汎用性と移植性に有利である.あるマシンではintタイプが2バイトを占有し,あるマシンではintタイプが4バイトを占有し,この場合のintはlongタイプの数値範囲に相当する.移植を容易にするには、次の操作を行います.
typedef int INT
typedef long INT
また、typedefを使用して配列を定義するには、次のようにします.
#include
 
typedef int INTARR[10];
 
int main(){
INTARRa={1,2};
printf(“%d/n%d/n”,a[0],a[1]);
return0;
}
2010-2-4午
----------------------------------------cuttingline----------------------------------------