演算子

演算子

言語演算子はタスク達成のために実行しなければならないいくつかのアルゴリズムの動作を示します。プログラム本体は、このような処理の連続です。1つ1つの演算はセミコロンで区切られます。

演算子

説明

重文演算子( {} )

中括弧 {} で囲まれた1つまたは複数の任意の型の演算子。

式の演算子( ; )

セミコロン( ; )で終わる式。

return 演算子

関数を終了し、制御を呼び出し元のプログラムに返します。

if-else 条件演算子

選択が必要な時に使用されます。

?: 条件演算子

if-else 条件演算子より簡単な構文で同じ機能を持ちます。

switch 選択演算子

式の値と一致する定数に処理の制御を与えます。

while 反復演算子

式が false になるまで、演算が反復的に実行されます。式は各反復の前にチェックされます。

for 反復演算子

式が false になるまで、演算が反復的に実行されます。式は各反復の前にチェックされます。

do-while 反復演算子

式が false になるまで、演算が反復的に実行されます。終了条件は各ループの後にチェックされます。ループ本体は常に少なくとも1回実行されます。

break 演算子

最も近くにある外側の switch、while、do-while、または for の処理から抜けます。

continue 演算子

最も近くにある外側の while、do-while、または for の反復処理の始まりに制御を与えます。

new 演算子

適切なサイズのオブジェクトを作成し作成したオブジェクトの記述子を返します。

delete 演算子

new 演算子によって作成されたオブジェクトを削除します。

1 つの演算子が複数の行を占めることがあり、反対に複数の演算子が 1 行で記述されることもあります。実行命令を制御する演算子( if、if-else、switch、while 及び for )は互いに入れ子にすることが出来ます。

例:

if(Month() == 12)
if(Day() == 31) Print(“Happy New Year!”);

重文演算子

重文演算子(ブロック)は、中括弧 {}で囲まれた1つまたは複数のさまざまな型で構成されます。括弧の後のセミコロン( ; )は不要です。

例:

if(x==0)
{
Print(“invalid position x = “,x);
return;
}

式の演算子

セミコロン( ; )で終了する式は演算子です。式の演算子の例としては次のものがあります。

代入演算子

識別子 = 式;

 x=3;
y=x=3;
bool equal=(x==y);

代入演算子は式の中で複数回使用出来ます。このケースでは処理は右から左へ行われます。

関数呼び出し演算子

関数名 (引数1,…, 引数N);

FileClose(file);

空 演算子

セミコロン( ; )のみで構成され、制御演算子の本体が空であることを示すために使用されます。

Return 演算子

return 演算子は実行中の 関数 を終了して、制御を呼び出し元のプログラムに返します。式の演算結果は呼び出し元の関数に返されます。式は代入演算子を含むことが出来ます。

例:

int CalcSum(int x, int y)
{
return(x+y);
}

void 型の戻り値を持つ関数では、式の部分を含まない return 演算子が使用されるべきです。

void SomeFunction()
{
Print(“Hello!”);
return;   // この演算子は省ける
}

関数の右中括弧は、式の部分を含まない return 演算子の実行を暗黙的に示します。

返せるものとしては、基本データ型、基本構造体、及びオブジェクトポインタがあります。return演算子は、配列、クラスオブジェクトや複合構造体の変数を返すことは出来ません。

If-Else 条件演算子

IF – ELSE 条件演算子は選択が必要な時に使用されます。形式的には、構文は次の通りです。

if (式)
演算子 1
else
演算子 2

式が true の場合、演算子 1 が実行され、制御は演算子 2 の次の演算子に与えられます(演算子 2 は実行されません)。式が false の場合、演算子 2 が実行されます。

if 演算子の else 部分は省くことが出来ます。else 部分を省略すると入れ子にされた if で分岐が現れるかもしれません。この場合、else は同ブロックにあって最も近い else 部分を持たない if演算子と関係します。

例:

//— else 部分は2 つ目の if 演算子と関係する
if(x>1)
if(y==2) z=5;
else     z=6;
//— else 部分は1 つ目の if 演算子と関係する
if(x>l)
{
if(y==2) z=5;
}
else        z=6;
//— 入り子にされた演算子
if(x==’a’)
{
y=1;
}
else if(x==’b’)
{
y=2;
z=3;
}
else if(x==’c’)
{
y=4;
}
else Print(“ERROR”);

三項演算子 ?:

三項演算子の一般的な形式は次の通りです。

1 ?式 2 : 式 3

1 番目のオペランド(式 1 )には bool 型の値の結果を持つ任意の式を使用出来ます。結果が true の場合、2 番目のオペランドによって設定された演算子、つまり「式 2 」が実行されます。

1 番目のオペランドが false の場合、3 番目のオペランド(式 3 )が実行されます。2 番目と 3 番目のオペランド、つまり「式 2 」と「式 3 」は同じ型の値を返し、これは void 型であってはいけません。条件演算子の実行結果は、式 1 の結果に応じて、式 2 または式 3 の結果となります。

//— 一日の始値と終値の差を正規化
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

これは下記と同じです。

  double true_range;
if(High==Low)true_range=0;               // 高/安値が等しい場合
else true_range=(Close-Open)/(High-Low); // 範囲が null でない場合

 

演算子の使用制限 #

この演算子は、「式 1 」の値に基づいて「式 2 」または「式 3 」の値を返さなければなりません。これらの式には、いくつかの制限があります。

  1. ユーザ定義型と基本データ型や列挙を混用してはいけません。ポインタにはNULLを使用出来ます。
  2. 値が基本型であれば、一番大きい型のオペレータが使用されます(型キャストをご参照ください)。
  3. 値のいずれかが列挙型で 2 つ目が数値型の場合、列挙型は int 型に置き換えられ、2 番目のルールが適用されます。
  4. 両方の値が列挙型の場合は、その型が同一である必要があり、演算子は列挙型となります。

ユーザ定義型(クラスまたは構造体)の制約事項は下記です。

  1. 型は同一であるか 2 つ目が  1 つ目からの派生型である必要があります。
  2. 型が同一(または継承)でない場合、子の型は暗黙的に親にキャストされ、演算子は親の型になります。
  3. オブジェクトとポインタを混用してはいけません。式は両方ともオブジェクトまたはポインタでなければいけません。ポインタにはNULL が利用出来ます。

Switch 演算子

式の値を全ての case と比較し、式の値と一致する case に処理の制御を与えます。各caseの変数は整数定数、リテラル定数または定数式でマークすることが出来ます。定数式は、変数や関数呼び出しを含むことは出来ません。switch演算子の式は整数型でなければいけません – intまたはuint。

switch(式)
{
case constant: operators
case constant: operators

default: operators
}

default ラベルでマークされた演算子は式の値がいずれの case 演算子の値とも異なる場合に実行されます。default は省くことができ、また最後に位置しないことも可能です。default が不在で、全ての case 演算子の値が式の値と異なる場合には、何も実行されません。

case キーワードと定数はただのラベルです。case の処理の実行後、プログラムは後に続くbreak 演算子まで更に進んで実行されます。これにて後に続くいくつかの演算を結びつけることが可能になります。

定数式はコンパイル時に計算されます。1 つのswitch 内で複数の定数が同じ値を持つことは出来ません。

例:

//— 例1
switch(x)
{
case ‘A’:
Print(“CASE A”);
break;
case ‘B’:
case ‘C’:
Print(“CASE B or C”);
break;
default:
Print(“NOT A, B or C”);
break;
}

//—  例 2
string res=“”;
int i=0;
switch(i)
{
case 1:
res=i;break;
default:
res=“default”;break;
case 2:
res=i;break;
case 3:
res=i;break;
}
Print(res);
/*
  結果
  default
*/

while反復演算子

while 演算子は満たされなければならない条件式と演算子で構成されています。

while(式)
演算子;

式が true の場合、式が false になるまで演算子が実行されます。式が false の場合、制御は次の演算子に与えられます。式の値は演算子が実行される前に定義されています。そのために、もし、式が先頭から false である場合は、演算子がまったく実行されません。

For 反復演算子

for 演算子は、3 つの式と実行可能な演算子で構成されています。

for(式 1 ; 式 2 ; 式 3 )
演算子;

式 1 はループ初期設定を記述します。式 2 はループの終了条件をチェックします。式 2 が true の場合、ループ本体の for が実行されます。ループは式が false になるまで繰り返します。 式 2 がfalse の場合、ループは終了し、制御は次の演算子に与えられます。式 3 は、各反復の後で計算されます。

for 演算子は次の演算子の連続に相当します。

式1;
while(式 2 )
{
演算子;
式 3 ;
};

for 演算子では 3 つのうちのどの式も同時に省くことは出来ますが、間にあるセミコロン( ; )を省くことは出来ません。式 2 が省略された場合、式 2 が常に true であると見なされます。for(;;) 演算子は while(1) 演算子と同等の連続ループです。式 1 または 3 はそれぞれコンマ( , )演算子によって結合された複数の式から成り立つことが出来ます。

do while 反復演算子

for 及び while ループは各ループの後でなく前に終了条件をチェックします。3 番目の反復演算子 dowhile は各ループ反復の後に終了条件をチェックします。ループ本体は常に少なくとも1 回実行されます。

do
演算子;
while(式);

まず演算子が実行され、その後で式が計算されます。式がtrueである場合、演算子が再び実行され、これが繰り返されます。式が false になると、反復が終了します。

Break 演算子

break 演算子は最も近くにある外側の switch、while、do-while 及び for 演算子から抜けます。制御は、終了した処理に続く演算子に与えられます。この演算子の目的のひとつは、変数が特定の値になった場合にループの実行を終了することです。

例:

//— 最初の 0 要素を探す
for(i=0;i<array_size;i++)
if(array[i]==0)
break;

Continue 演算子

continue 演算子は、最も近くにある外側の while、do-while または for の反復処理の始まりに制御を与えて、次の繰り返しを呼び出します。この演算子の目的は break 処理の反対です。

例:

//— 0 以外の要素の合計
int func(int array[])
{
int array_size=ArraySize(array);
int sum=0;
for(int i=0;i<array_size; i++)
{
if(a[i]==0) continue;
sum+=a[i];
}
return(sum);
}

new オブジェクト作成演算子

new 演算子は、対応するサイズのオブジェクトを自動的に作成し、オブジェクトのコンストラクタを呼び出して作成されたオブジェクトの記述子を返します。失敗した場合、この演算子は NULL 定数と比較出来る null 記述子を返します。

new 演算子はクラスオブジェクトのみに適応出来ます。構造体には適応出来ません。

この演算子はオブジェクトの配列の作成には使用できません。オブジェクトの配列の作成には ArrayResize() 関数が使用されます。

例:

//+——————————————————————+
//| 図の作成                                                          |
//+——————————————————————+
void CTetrisField::NewShape()
{
m_ypos=HORZ_BORDER;
//— 7 つの可能な図形から 1 つをランダムに選んで作成する
int nshape=rand()%7;
switch(nshape)
{
case 0: m_shape=new CTetrisShape1; break;
case 1: m_shape=new CTetrisShape2; break;
case 2: m_shape=new CTetrisShape3; break;
case 3: m_shape=new CTetrisShape4; break;
case 4: m_shape=new CTetrisShape5; break;
case 5: m_shape=new CTetrisShape6; break;
case 6: m_shape=new CTetrisShape7; break;
}
//— 描画する
if(m_shape!=NULL)
{
//— 事前設定
m_shape.SetRightBorder(WIDTH_IN_PIXELS+VERT_BORDER);
m_shape.SetYPos(m_ypos);
m_shape.SetXPos(VERT_BORDER+SHAPE_SIZE*8);
//— 描画する
m_shape.Draw();
}
//—
}

オブジェクト記述子はメモリアドレスへのポインタではないことには留意すべきです。

new 演算子を使用して作成したオブジェクトは、明示的に delete 演算子を使用して解除されるべきです。

delete オブジェクト解除演算子

delete 演算子は new 演算子で作成されたオブジェクトを解除し、対応するクラスのデストラクタを呼び出し、オブジェクトによって占有されていたメモリを解放します。既存のオブジェクトの実際の記述子がオペランドとして使用されます。削除操作が実行された後、オブジェクト記述子は無効になります。

例:

    //— 図を解除する
delete m_shape;
m_shape=NULL;
//— 新しい図を作成する
NewShape();

Originally posted 2019-07-27 10:09:09.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">