C/C++言語で注意すべき問題

4035 ワード

1,キーワードvolatile
<!-- lang: cpp -->
   long square(volatile int x) 
   {   //int a=x;
    return a*a;
    }          

コンパイラによって最適化されたコードが
<!-- lang: cpp -->
 long square(volatile int x) 
 {   int a=x;
     int b=x;
    return a*a;
  }

変数xは予想外に変化する可能性があるため、必ずしもxの二乗値が得られるとは限らない.コードを
<!-- lang: cpp -->
 long square(volatile int x) 
 {   int a=x;
    return a*a;
  }

2,malloc(0)の戻り値malloc(0)は、スタック上の任意の1バイトのアドレスを返し、返されるアドレス空間は、それを操作することができる.
3、typedefと#defineはデータ型の別名を定義します.どちらがtypedefを使うのが一番いいですか.理由は以下の通りです.
<!-- lang: cpp -->
typedef struct str * tpstr;
#define struct str * dpstr

変数を定義すると、tpstr s 1,s 2;定義されているのはすべてポインタ変数です.dpstr s 1,s 2;struct str*s 1,s 2に相当する.s 1はポインタ変数,s 2は構造変数であり,自分が最初に望んだものではない.
4,符号なしと符号ありの演算、結果は符号なし、符号なしと符号ありの数は混用しないほうがいい!メモリの中のコードは補数になります!正数はそれ自体であり、負数は補符号(逆符号プラス1)である.
5,64ビットマシンの64ビットタイプはどのようなものですか?
C 99規格はlong longタイプを定義し、その長さは少なくとも64ビットを保証することができ、このタイプはいくつかのコンパイラで実現されて久しい.他のコンパイラではlonglongのような拡張が実現されています.
6、関数とグローバル変数をどのように定義し、宣言しますか?まず、定義と宣言の概念を理解します.両者の違いは、ストレージスペースを割り当てることを定義することです.宣言は、コンパイラに変数タイプと名前を使用するように伝えます.同じ変数は1回のみ定義できます(初期値を指定できます)が、複数回宣言できます.たとえば、int aは、宣言時に記憶領域を作成します.これは定義的宣言であり、定義です.extern int aは、宣言変数aが別のファイルで定義されているだけで、参照宣言なので、定義が含まれていると言います.定義は宣言の特例です.関数の宣言と定義は比較的簡単で、加算されません「{}」は宣言であり、「{}」を付けると定義されます.通常、関数、変数の宣言と定義は異なるファイルに分けられ、宣言は置かれている.hヘッダファイルには、ヘッダファイルを含む配置が定義されている.c中.
7,Cはどのように継承などのオブジェクト向けのプログラム言語の方法をシミュレートしますか?関数ポインタを定義できるので、定義した構造体を直接関数ポインタに加えると簡単な方法が実現され、構造体が簡単にネストされ、簡単な継承が実現されます!
8,このようなコードは実行できない:a[i]=i++;実行できません.理由i++式には副作用があり、iの値を変更します.iは同じ式が他の場所で参照されているため、定義されていない結果になり、その値が古い値なのか新しい値なのか判断できません.
9、関数の呼び出し順序、例えばf 1()+f 2()*f 3();演算規則が乗算を先に計算して加算することを知っていますが、3つの関数の呼び出し順序は分かりません.私たちが望む結果を得るには、独立した文と明確な一時変数しか使用しません.
10、2つの整数を除いた結果は整数で、整数はやっと余剰を求めることができて、余剰の記号は左の数の記号と同じです.
11,C++のインライン関数,定義方法は,関数定義時に関数の種類の前に修飾語inlineを追加する.その本質
       (           )       。

インライン関数を使用して注意すべき問題:
一、C++では、関数内に循環、switch分岐、複雑にネストされたif文を含む以外、すべての関数をインライン関数として定義することができる.
二、インライン関数も前に定義し、後に呼び出す.パラメータと実パラメータの関係は一般的な関数と同じです.
三、ユーザーが指定したインライン関数に対して、コンパイラがインライン関数として処理するかどうかはコンパイラが自分で決定する.インライン関数を説明する場合は、コマンドコンパイラがそうするのではなく、インライン関数の拡張としてコンパイラに要求するだけです.
四、前述したように、インライン関数の実質は空間交換時間を採用することであり、プログラムの実行を加速することができ、同じインライン関数を複数回呼び出すと、プログラム自体が占有する空間が増加する.前例のように、インライン関数が1回だけ呼び出される場合、プログラムが占有するストレージ間は増加しません.
12,C++のパラメータについて
一、パラメータにはデフォルト値がありますが、左のデフォルトではありません.
<!-- lang: cpp -->
void f(int a,int b=20);

二、関数の原型説明時にパラメータに変数名がなくてもよい.
<!-- lang: cpp -->
void f(int,long b,int c=20);

三、前に一度だけデフォルト値を定義します.つまり、プロトタイプの説明時にデフォルト値を定義します.後の関数の定義にはデフォルト値はありません.
四、可変パラメータについては、前述の説明はパラメータ数が固定されているパラメータであるが、場合によっては、関数パラメータの個数は確定できないが、呼び出されたときに確定する.この場合、C++はパラメータの個数が固定されていない関数を定義する.
まず、va_を使いますstart()、va_arg()、 va_end()の3つのライブラリ関数には、ヘッダファイル「stdarg.h」が含まれている必要があります.
次に、va_について説明します.Listタイプの変数、va_Listはint,floatクラスと同様で,C++システムが予め定義したデータ型(非float)であり,このタイプの変数によってのみ実際のパラメータテーブルから可変パラメータを取り出すことができる.次の関数を定義します.
<!-- lang: cpp -->
  void fun(int a,int b,...){ //  "..."      ,             b
  va_list   ap;
  va_start(ap,b);           //   ,     b       
  int temp=va_arg(ap,int);          //     ,int           
  va_end(ap);             //      
 }

引数の数が可変な関数を使用する場合は、次の点に注意してください.
 、      ,                ,       ,       “...”      。      ,         。
 、      va_start()        ,                ;    va_arg()           ;     va_end()      ,        。
 、             ,                       。

13,C++演算子のリロード、メンバー関数で演算子のリロードを実現する場合、演算子のリロード関数のパラメータには、パラメータがない場合、または1つのパラメータがある場合の2つしかありません.++などのオペランドが1つしかない演算子では、この演算子を再ロードするときにパラメータを持つことはできません.2つのオペランドを持つ演算子には、1つのパラメータしかありません.このパラメータは、オブジェクト、オブジェクトの参照、または他のタイプのパラメータです.C++では、3つのオペランドの演算子の再ロードは許可されていません.