10


1

x ++で宣言した後、セミコロンは本当に必要ですか?
  • Microsoft Dynamics AX 2009プログラミング:はじめに*の本で述べたように、x ++の宣言の後にセミコロンを置く必要があります。

_ コードの最初の行がキーワードでない限り、変数宣言の後の余分なセミコロンは必須です。 セミコロンは、変数宣言が終了したことをコンパイラーに伝えます。 このセミコロンの後に新しい変数を宣言することはできません。 _

(変更されていない本から直接コピーされ、必要に応じて削除します)

ただし、セミコロンを削除してジョブを実行すると、エラーや問題はまったくありません。

static void Job1(Args _args)
{
    str string1 = "STACKOVERFLOW";
    ;
    print string1;
    pause;
}

のように動作します

static void Job2(Args _args)
{
     str string1 = "STACKOVERFLOW";

     print string1;
     pause;
}

本当に必要ですか? それを使用することに慣れる必要がありますか?

4 Answer


14


http://sysdictcoder.com/blog/the-lone-semicolon/ [こちら]でかなりエレガントに説明されています。

重要な引用[強調鉱山]:

_ _ _ "追加のセミコロンが必要な理由は、*コンパイラが変数宣言の終了位置を常に確認できるわけではない*ためです。 少しでも助けなければ、推測できます。 推測するのはあまり得意ではありません。」_

コンパイラはコードを分析している間、行の最初の単語が型の名前(AOTオブジェクト)と一致するかどうかをチェックします。 型名の場合、コンパイラはその行を変数宣言として扱います。*この場合、変数名は次にあるはずです。 _ _


7


AX 2012のリリースでは、変数宣言の後にセミコロンを追加する必要はありません。


6


コードの本文がキーワードで始まっていない場合にのみ、セミコロンが必要です。 この例では、コードは組み込みキーワードである「print」で始まります。 「string1 + = "。COM"; `」でコードを開始しようとした場合、エラーが表示されます。

Dynamics AX 2009は、余分なセミコロンを必要とするAXの最後のバージョンです。 AX 6.0は、これを修正する必要があります。 ]


4


宣言後の* next word *が、タイプ(EDT、テーブル、クラスなど)のようなコンパイラーによって認識されるキーワードでない場合、素敵なセミコロンは本当に必要ありません(コンパイルエラーは発生しません)。 ..)

例えば:

void method1()
{
    CustTable    custTable;

    custTable = CustTable::find("cust");
}

*エラー!*コンパイラはX コードの開始のクラス宣言ブロックを分離できません。 コンパイラが2行目を読み取るとき、custTableが新しい変数であるか、X コードの一部であるかはわかりません。 そのため、コンパイラの宣言の終了位置(実際には、X ++コードの開始位置)を示すために、余分なセミコロンが必要です。

void method1()
{
    CustTable    custTable;

    if (custTable)
    {
        // stuff happens
    }
}
  • WORKS!*コンパイラーは、 `if`型の変数(明らかに予約キーワードです)を宣言できないことを知っているので、これがX ++コードの始まりであり、この行の後に変数を宣言できないことは明らかです。

変数宣言がない場合でも、これはそのように機能します。

CustTable method1()
{
    custTable = CustTable::find("cust"); // custTable may exists in the context
    return custTable;
}

エラー! `custTable`はデカレーション、またはその例のようなX ++コードである可能性があります。

CustTable method1()
{
    return CustTable::find("cust");
}
  • WORKS!*として `return`を宣言することはできません。

追加:

void method1()
{
    info("This should work, ya?");
}
これは動作するはずです(「info」は型ではないため)。 …​ しかしそうではありません! Why? 「info」はフルネーム「Global

info()」に置き換えられる特別なカーネルメソッドであるため、最初のトークンはプリコンパイラーの置き換え後は「Global」になり、「Global」はクラスになります。