C++のあれらの事:式と文

6597 ワード

式#シキ#
1は、関数呼び出しを演算子として扱うべきであり、演算に参加するオブジェクトに数の制限はありません.
2、「左値(lvalue)」と「右値(rvalue)」について簡単にまとめることができます.オブジェクトが右値として使用される場合、オブジェクトの値(内容)が使用され、オブジェクトが左値として使用される場合、オブジェクトのアイデンティティ(メモリ内のビット)が使用されます.
より具体的な左値と右値の例:C++priemr 5 ed P 121
3、演算子の優先度は演算対象の組み合わせを規定しているが、演算対象がどのような順序で評価されるかは説明されていない.多くの場合、次の式のように、評価の順序が明確ではない.
int i= f1() + f2();

f 1を先に呼び出すかf 2を先に呼び出すかは不明である.したがって、この演算子では、次のコードのように、複数の演算オブジェクトが同じ変数を共に変更することは避けられます.最終出力は決定されません.
int i=0;
cout<< i << "" << ++i << endl; //    

ただし、C++の4つの演算子は、演算対象の評価順序を明確に規定しています.これも、独自に定義したクラスタイプでは、これらのオペレータを再ロードしないのが一般的です.
4,短絡評価:論理と演算子と論理または演算子は、左側の演算オブジェクトの値を求めてから右側の演算オブジェクトの値を求め、左側の演算オブジェクトが式の結果を決定できない場合にのみ右側の演算オブジェクトの値を計算します.
5,i++と++iを区別する
後置オペレータは、元の値を保存してからi+1を返し、元の値のコピーを返す必要があります.フロントオペレータは、元の値に1を加えて返すだけです.したがって++iはi++よりも効率的であり、もちろんiがintタイプやポインタの場合、コンパイラはi++を最適化しますが、他のクラスタイプや複雑なクラスの反復器の場合はできません.
6,参照オペレータと++オペレータの優先度を解除することに注意し,実際のコードでは簡潔のために*(i++)を*i++と書くことが多い.++の優先度は参照解除オペレータより高いからです.
7,条件オペレータを使用する場合は,深さネストされた条件オペレータの書き出しは極力避ける.また、条件オペレータの優先度は非常に低く、式で使用する場合はカッコを付けることに注意してください.例えば、cout<<(i8、sizeof演算子について.sizeofの演算結果はコンパイル時の定数です.次のコードの値に注意してください.
1 int a[10];
2 int* p = a;
3 int n1 = sizeof(a) / sizeof(*a); // n1=10
4 int n2 = sizeof(p) / sizeof(*p); // n2=1

sizeof演算子小贴士:
1  char     char      sizeof  ,   1。
2        sizeof                。
3      sizeof               。
4         sizeof                   ,       。
5      sizeof                ,                 sizeof          。  sizeof               。
6  sting   vector    sizeof               ,                 。

9.複合式の評価では、演算子の優先度と結合性に特に注意します.特に、!===との優先度は<=,>=等関係演算子より小さい.
10、タイプ変換
1)暗黙的な変換
次の場合、コンパイラは演算オブジェクトのタイプを自動的に変換します.
1         , int                   。
2     ,           。
3       ,           ;      ,                  。
4                      ,          。
5      ,            。
6

2)明示的な変換
1 statci_cast<Type>:             ,       const
2 const_cast<Type>:          const
3 reinterpret_cast<Type>:                       。
4 dynamic_cast<Type>:       。

ステートメント
1.ほとんどの言語と同様に、C++は、条件付き実行文、同じコードを繰り返し実行するループ文、および前制御フローを中断するためのジャンプ文を提供します.
2.ブロック文を使用する場合、ブロック文内で定義された変数の役割ドメインはブロック領域内のみであることに注意してください.特に、ifまたはfor文などの制御文では、初期化または定義された変数は、ブロック領域の役割ドメインのみである.
3,switch文の使用.caseタグは整形定数式でなければなりません.switch文内に変数を定義することはできません.その下にcaseまたはdefault文がある場合は、変数定義を実行しないcaseブランチの場合、変数定義の下のcaseブランチを実行する場合があります.変数をコードブロック内に定義しない限り.
4,forループではcontinue文があればcontinueの後ろの文をジャンプしますが、for文のカウンタ変化文はジャンプしません.
5,範囲for文
範囲for文は、コンテナまたは他のシーケンスのすべての要素を遍歴できるC++11に新しく導入された内容です.構文形式は次のとおりです.
1 for(declaration:expression)
2   statement;

ここでexpressionは、カッコで囲まれた初期値リストやvectorやstringなどのタイプのオブジェクトなどのシーケンスを表す必要があります.これらのタイプの共通の特徴は、反復器に戻るbeginとendメンバーを持つことです.
declarationは、シーケンス内の各要素が変数のタイプに変換できる変数を定義します.タイプが適合していることを確認する最も簡単な方法はautoタイプ説明子を使用することです.このキーワードはコンパイラに適切なタイプを指定するのに役立ちます.シーケンス内の要素の書き込みが必要な場合は、ループ変数を参照タイプとして宣言する必要があります.
次は範囲for文でvectorを巡る例です.
1 vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2 for (auto &r : v)
3 {
4     r *= 2;
5 }

範囲forを使用する場合、文は範囲for文でvectorオブジェクトの要素を増やすことはできません.範囲for文にはend()の値が予め格納されているからです.シーケンスに要素を追加(削除)すると、end関数の値が無効になる可能性があります.