4

我有兴趣了解编译器是如何解释语句的……</p>

项目类型是 C++ IDE 是 XCode 3.2 64bit 操作系统是 Mac OS X 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 回答