2

对于 for 语句,我有一些不明白的地方,在下面的代码块中,请专注于 ??? 评论:

void user_interface::execute_a_command( const string& cmd, command cmd_table[] )
{
    LOG("user_interface::execute_a_command(): Executing \"",cmd,"\"");
    bool command_executed = false;
    //Exist any operation for this command?
    command* elem = &cmd_table[ 0 ]; //???
    for( int i = 0 ; cmd_table[ i ].function != nullptr ; i++, elem = &cmd_table[ i ] )
    {
        if( cmd == elem->name )
        {
            //Call the function
            (this->*(elem->function))();
            command_executed = true;
            break;
        }
    }

好吧,这段代码编译得很好,没有具体的警告。但是,如果我将“elem”的声明和初始化放在“for”语句中,如下所示:

for( int i = 0 , command* elem = &cmd_table[ 0 ] ; cmd_table[ i ].function != nullptr ; i++, elem = &cmd_table[ i ] )

g++ 4.7.2 不编译此代码并出现此错误:

game.cpp:834:27:错误:''令牌之前的预期初始化程序game.cpp:834:27:错误:预期';' ' ' 标记之前

我不清楚为什么。有人可以帮我理解这里的问题吗?

谢谢

4

4 回答 4

9

您不能在初始化程序中声明不同类型的变量。如果它们属于同一类型,它将起作用:

for (int ii = 0, jj = 1, kk = 2; ii < count; ++ii, --jj, kk += 15) {
    // ...

进一步,多个变量声明要求它们是相同的类型:

int a, b = 2, *c; // Yes
float x, double y, std::string z = "no"; // no
于 2012-12-20T13:50:01.310 回答
2

语句中的初始化for可以定义多个变量,但所有变量需要具有相同的类型。

于 2012-12-20T13:53:36.313 回答
1

之前的两个答案都是正确的,并且直接解决了您的问题,但是我将提供我喜欢的样式,即直接在循环内声明这样的“便利变量”:

for( int i = 0 ; cmd_table[ i ].function != nullptr ; i++ )
{
    command* elem = &cmd_table[ i ];
    if( cmd == elem->name )
    {
        //Call the function
        (this->*(elem->function))();
        command_executed = true;
        break;
    }
}

这提供了对 的“干净”访问,并且在循环结束后cmd_table不会让您无效。elem此外,这样做不会影响性能,因为它只是编译器无论如何都会优化的指针。

于 2012-12-20T13:58:19.837 回答
1

您不能使用逗号运算符进行 2 个不同类型的声明。

于 2012-12-20T13:51:07.960 回答