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

The initialization in the for statement can define multiple variables but all variables need to have the same type.

于 2012-12-20T13:53:36.313 に答える
1

コンマ演算子を使用して異なる型の 2 つの宣言を行うことはできません。

于 2012-12-20T13:51:07.960 に答える
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 に答える