次の方法で共有


X++ 条件付きステートメント

コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。

この記事では、X++ の条件付きステートメントについて説明します。 条件付きステートメントは、ifif...elseswitch です。 三項演算子 (?:) は、指定された式に基づく値を提供します。 条件付きステートメントを使用して、ステートメントを実行するか (if ステートメントを使用)、またはどちらを実行するか (if..elseを使用) を指定します。 異なる条件文は、異なる状況において利点を提供する。

if および if...else ステートメント

if ステートメントは、条件式を評価し、条件式が true として評価された場合にステートメントを実行します。 else 句を使用すると、条件が false と評価される場合に実行される代替ステートメントを提供することができます。 if...else ステートメントの構文は次のとおりです。

if (expression)statement[elsestatement]

この構文では、どちらの ステートメント複合ステートメント (中括弧で囲まれた 0 個以上のステートメント) にすることができます。 かっこで囲まれた (つまり、条件式) は、true または false として解釈される有効な式にすることができます。 すべての型の値はブール値として解釈できます: 0 (ゼロ) を除くすべての数値は true であり、すべての空でない文字列は true です。 if ステートメントは入れ子にすることができます。 ただし、if ステートメントの入れ子が深くなりすぎる場合、switch ステートメントを代わりに使用して読みやすくすることを検討してください。

if および if...else ステートメントの例

// if statement
if (a > 4)
{
   info("a is greater than 4");
}

// if... else statement 
if (a > 4)
{
   info("a is greater than 4");
}
else
{
   info("a is less than or equal to 4");
}

switch ステートメント

switch ステートメントは、入れ子になった if ステートメントと同じ動作をするマルチブランチ言語コンストラクトです。 switch キーワードの後の式が評価され、それぞれの case の値に対してチェックされます。 case の値は、コンパイル時に評価できるように定数でなければなりません。

  • ケース定数が切り替え式と一致する場合、case ステートメントを実行します。
  • そのケースに break ステートメントが含まれている場合、プログラムはスイッチからジャンプ アウトします。
  • ケースに break ステートメントが含まれていない場合、プログラムは継続し、次の ケース ステートメントを実行します。
  • 一致が見つからない場合、既定ステートメントを実行します。
  • 一致するものがなく、default ステートメントがない場合、switch ステートメント内のステートメントは実行されません。

switch ステートメントの構文を次に示します。

switch(){{ ケース }[デフォルト:ステートメント]}

case ブロックの構文は次のとおりです:

caseexpression{ ,expression} :statement

一般に、各 case を終了するために break ステートメントを使用しない状況は、このようなコードを簡単に読み間違える可能性があるため、避ける必要があります。

切り替え明細書の例

Switch ステートメントに break キーワードを含めると、case ブランチの実行は終了し、switch に続くステートメントが実行されます。 次の例のように、Debtor のアカウント番号が 1000 の場合、プログラムは "作業をする" が実行され、 switch ステートメントの後で実行が継続されます。

switch (Debtor.AccountNo)
{
    case "1000":
        // do something
        break;
    case "2000":
        // do something else
        break;
    default:
        // default statement
        break;
}

次のコード例では、break ステートメントを省略して最初の case 分岐から実行をドロップします。 Xが10の場合、bはaに割り当てられ、dはcに割り当てられます。 Xが11の場合、dはcに割り当てられます。 Xが12の場合、fはeに割り当てられます。

 switch (x)
 {
     case 10:
         a = b;
     case 11:
         c = d;
         break;
     case 12:
         e = f;
         break;
 }

break ステートメントを使用しない場合、switch ステートメントのプログラム フローは次の case に進みます。 コード セグメント AとBには同じ動作が設定されています。

このフローはお勧めしません。

// Code segment A (break omitted)
case 13:
case 17:
case 21:
case 500:
    info("g");
    break;

// Code segment B (the values are comma-delimited)
case 13, 17, 21, 500;
    info("g");
    break;

三項演算子 (?)

三項演算子 (?:) は、2 つの値のいづれかに解決される条件式です。 三項演算子の構文を次に示します:

expression1?expression2:expression3

この構文では、expression1true または false のブール値として解釈されます。 expression1true である場合、三項全体の明細書は expression2 を返します。 それ以外の場合、ステートメントは expression3 を返します。 expression2expression3 の両方は同じタイプである必要があります。

三項演算子 (?:) の例

次のコード例では、メソッド呼び出しからのブール値の戻り値に基づいて、2つの文字列のいずれかを返します。 ブール式は、CustTable テーブルに、RecIdフィールド値を1とする行が含まれているかどうかを示します。 このブール式が true (つまり、RecId! = 0) である場合は、found が結果に割り当てられます。 それ以外の場合、代替のnot foundが結果に割り当てられます。

result = (custTable::find("1").RecId) ? "found" : "not found";

式は三項演算子で入れ子にできます。 次の例では、 x の値に基づいて、3つの値のいずれかを レベル に割り当てます。

int x = 1001;
str level = x <= 1000 ? "A" : (x <= 2000 ? "B" : "C");
info(level);
// Output is "B".