理解编译器 - 一个什么都不做的声明?

时间:2012-12-12 15:10:07

标签: c++ compiler-construction

我有兴趣了解编译器如何解释语句......

项目类型是C ++ IDE是XCode 3.2 64位 操作系统是Mac OS X 10.6.8

警告:代码示例是无限循环。

在下面的代码示例中或附加的图像中。什么是编译器做的事情。没有出现重大错误,也没有出现小错误(根据我当前的编译器设置)。非常有兴趣了解案例陈述中发生的事情:

    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

3 个答案:

答案 0 :(得分:2)

表格

的一行(或更多)代码
expression;

称为表达式语句。评估表达式,程序的状态根据表达式的副作用而变化。例如:

nrTask = C;

导致程序评估表达式nrTask = C,这会产生改变nrTask值的副作用。

D;评估表达式D,它没有任何副作用,因此无效。

该语言允许任何表达式用作表达式语句的主体;但是,一个好的编译器应该发出警告,如果它没有效果,因为它几乎总是一个错误。如果您启用警告(-Wunused-value仅用于警告,或者更好的是-Wall -Wextra以获取许多有用的警告),那么编译器应该通过“语句无效”等警告指出您的错误。

答案 1 :(得分:1)

在C情况下,您缺少nrTask = D;语句,因此您的状态机在下一个循环中转换为该情况,否则它将无限期地保留在状态C中。单个语句D;不执行任何操作,它只是将常数D评估为时间,从不分配给任何东西或产生任何副作用

答案 2 :(得分:0)

声明

D;      // What is going on at this statement

什么都不做。最有可能的是,编译器甚至会使用最基本的优化设置将其抛出。 如果你提高编译器的警告级别,它很可能会开始抱怨该语句什么都不做。

这些陈述首先是合法的原因可能是因为没有人禁止使用这些无用的语句而没有禁止使用类似的但有用的语句,因此没有人想要使C ++的语法更加复杂。