C/C++学習ノート-02

3840 ワード

C++学習ノート-02
C++のカンマ式
カンマ演算子を使用するのは、いくつかの式を直列にするためです.カンマ式全体の値は、カンマで区切られたリストの最後の式の値です.本質的には、カンマの役割は、一連の演算が順次実行されることである.
右端の式の値はカンマ式全体の値となり、他の式の値は破棄されます.例:
var = (count=19, incr=10, count+1);

ここでは,まずcountを19,incrを10,countを1,最後に最右式count+1の計算結果20をvarに与える.カンマ演算子の優先度が割り当てオペレータより低いため、上の式のカッコが必要です.
次の列を見てみましょう.
#include 
using namespace std;

int main()
{
    int i, j;

    j = 10;
    i = (j++, j+100, 999+j);

    cout << i;

    return 0;
}       

2 D配列2 Dはいれつ
2 D配列は列の数を指定する必要があります.行の数は指定しなくてもいいです.2 D配列の初期化方法は以下のとおりです.
(1)支店による初期化
int a[2][3]={{1,2,3},{4,5,6}}; 
 { }    { }     ,   { }    1,2,3 0  3      。   { }    4,5,6 1  3      。
         : int a[2][3]; a[0][0]=1;a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6; 
  ,                   ,    。

(2)非分岐の初期化
int a[2][3]={ 1,2,3,4,5,6}; 
 { }        a     (    )。 a[0][0]=1; a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6;

(3)部分配列要素の初期化
static int a[2][3]={{1,2},{4}}; 
     2   ,       a[0][0] a[0][1];      4  a[1][0]。       static,           0。 :  C    ( :Turbo C) ,      static           0。 
static int a[2][3]={ 1,2}; 
  2   , a[0][0]=1,a[0][1]=2,           0。 

(4)1次元の定義は省略できますが、2次元の定義は省略できません.システムは、初期化されたデータの個数と2次元の長さに基づいて、1次元の長さを決定することができる.
int a[ ][3]={ 1,2,3,4,5,6}; 
a            ,      6 ,       3,   3  ,  a       2。 
  ,         ,             : 
           ,            ;     ,           1。  ,int a[ ][3]={ 1,2,3,4};   :int a[2][3]={ 1,2,3,4}; 
      ,           。           { },    a     。 
static int a[ ][3]={{1,2},{4}};

ダイナミックリンクライブラリと静的リンクライブラリ
ライブラリには、静的リンクライブラリと動的リンクライブラリの2つがあります.いずれのライブラリでも、使用するには、対応するincludeヘッダファイルをプログラムに含めます.まずプログラムコンパイルの過程を振り返ってみましょう.次の図を示します.
1、静的リンクライブラリ
リンクフェーズでは、ソースファイルで使用するライブラリ関数とアセンブリ生成されたターゲットファイルを作成する.oマージ実行可能ファイルを生成します.この実行可能ファイルは大きい場合があります.
このリンク方式の利点は,実行可能プログラムがライブラリ関数とは関係なく,どのような環境でも実行できるため,プログラム移植を容易にすることである.
次の簡単な関数を書きます.ライブラリ・ファイルのヘッダ・ファイルを生成します.対応するソース・ファイルは次のとおりです.
次に静的ライブラリを生成する:g++-c printと入力.cpp生成oターゲットファイル
次にarコマンドでライブラリlibprintをさらに生成する.a:
ar -crv libprint.a libprint.o
これにより、静的リンクライブラリlibprintが生成する.a.
テストファイルを作成します.
ファイルをコンパイルします.
g++ -o atest main.cpp -L ./ -l print
-L           
-l          

実行可能ファイルが生成されると、静的リンクライブラリは削除され、プログラムの正常な実行に影響しません.
2、ダイナミックリンクライブラリ
ダイナミックリンクには移植性が悪いという欠点があります.2台のコンピュータの実行環境が異なると、ダイナミック在庫の位置が異なるため、プログラムの実行に失敗する可能性があります.具体的な応用の中で、静的と動的は合理的に選択しなければならない!!!
上のコードを使用して、ダイナミックリンクライブラリを生成します.
入力:g+-fPIC-shared-o libprint.so print.cpp
これによりlibprintが生成する.soのダイナミックライブラリ
同様に動的リンクでmainをコンパイルする.cpp:g++ -o sotest main.cpp -L ./-l print
注意:実行時にエラーが表示されます:./sotest: error while loading shared libraries: libprint.so:cannot open shared object file:No such file or directoryこれは/etc/ldのためです.so.confファイルにはダイナミックライブラリが探すパスが設定、ld.so.confファイルの下に私たちのsoファイルを含むディレクトリを追加し、sudo ldconfigをクリックすればいいです. 
この方法で実行可能ファイルを生成すると、ダイナミックリンクライブラリは削除できません.そうしないと、プログラムは実行できません.最後に、図のように2つの方法で生成されたファイルのサイズを比較します.
付録:
g++(gcc)コンパイルオプションl-shared:ダイナミックリンクライブラリの生成を指定します.
l-static:静的リンクライブラリの生成を指定します.
l-fPIC:共有ライブラリをコンパイルするためにコンパイルされた場所が独立したコードを表します.ターゲットファイルは、実行可能プログラムがマウントされたときに、実行可能プログラムのメモリ内のどこにでも置くことができる位置依存コードを作成する必要があります.
l-L.:接続するライブラリがあるディレクトリを示します.
l-l:リンクに必要なダイナミックライブラリを指定します.コンパイラは動的接続ライブラリを検索する際に暗黙の命名規則があり、すなわち与えられた名前の前にlibを付け、後に付ける.a/.soでライブラリの名前を決定します.
l-Wall:すべての警告情報を生成します.
l-ggdb:このオプションは、gdbの使用可能なデバッグ情報を可能な限り生成します.
l-g:コンパイラはコンパイル時にデバッグ情報を生成します.
l-c:前処理、コンパイル、アセンブリのみをアクティブにします.つまり、プログラムをターゲットファイル(.oファイル)にします.
l-Wl,options:パラメータ(options)をリンクldに渡す.optionsの真ん中にカンマがある場合は、optionsを複数のオプションに分けてリンクプログラムに渡します.