4

コンパイラがステートメントをどのように解釈しているかを理解することに興味があります…</p>

プロジェクトタイプはC++IDEはXCode3.264ビットオペレーティングシステムはMacOSX 10.6.8

注意:コードサンプルは無限ループです。

以下のコードサンプルまたは添付の画像。コンパイラは何をしているのでしょうか。大きなエラーは発生せず、小さなエラーも発生しません(現在のコンパイラ設定を前提としています)。ケースステートメントCで何が起こっているかを理解することに主に関心があります。

    bool nrContinue;
    enum Task {

        A,
        B,
        C,
        D

    };

    nrContinue = 1;
    Task nrTask = A;

    while (nrContinue) {

        switch (nrTask) {

            case A:

                cout << endl << "Processing task: " << A;
                nrTask = B;

                break;
            case B:

                cout << endl << "Processing task: " << B;
                nrTask = C;

                break;
            case C:

                cout << endl << "Processing task: " << C;

                // --------------------------------------------------
                // Below is the statement of my misunderstanding

                D;      // What is going on at this statement

                break;
            case D:

                cout << endl << "Processing task: " << C;
                nrContinue = 0;

                break;
            default:

                cout << endl << "Default case was unexpected.";
                nrContinue = 0;

                break;

        }

    } // loop
4

3 に答える 3

2

フォームのコードの行 (またはそれ以上)

expression;

式ステートメントとして知られています。式が評価され、式の副作用に応じてプログラムの状態が変化します。たとえば、次のようになります。

nrTask = C;

は、プログラムに式 を評価させますnrTask = C。これには、 の値を変更するという副作用がありますnrTask

D;D副作用がないため何もしない式 を評価します。

この言語では、任意の式を式ステートメントの本体として使用できます。ただし、ほとんどの場合は間違いであるため、効果がない場合、優れたコンパイラは警告を発行する必要があります。警告を有効に-Wunused-valueした場合 (その警告だけ、または-Wall -Wextra多くの有用な警告に対してはさらに良い)、コンパイラは「ステートメントは効果がありません」などの警告で間違いを指摘する必要があります。

于 2012-12-12T15:24:24.463 に答える
1

ケースCの場合、ステートメントが欠落してnrTask = D;いるため、ステートマシンは次のループでそのケースに移行します。それ以外の場合は、状態Cに無期限に留まります。単一のステートメントD;は何もせず、定数Dを一時的なものとして評価するだけです。何かにまたは任意の副作用を生成します

于 2012-12-12T15:13:21.240 に答える
0

ステートメント

D;      // What is going on at this statement

何もしません。ほとんどの場合、コンパイラは最も基本的な最適化設定でそれを破棄します。また、コンパイラの警告レベルを上げると、ステートメントが何もしないと文句を言い始める可能性が高くなります。

そのようなステートメントがそもそも合法である理由は、おそらく、見た目は似ているが有用なステートメントを禁止することなく、これらの役に立たないステートメントを禁止することによって、C++ の構文をこれまで以上に複雑にしようとしている人が誰もいなかったからです。

于 2012-12-12T15:24:12.677 に答える