3

文字列内の式から次の数値を抽出する単純な関数を作成しようとしていますが、関数の終了後に参照パラメーター ioIsValidExpression が更新されないという問題があります。test3 (getNextNumber(...) を呼び出す前に呼び出される) と ioIsValidExpression (関数内での名前) のアドレスが同じであるため、実際には正しい変数 (一時変数ではない) を参照しているように見えます。

これはどこかで恥ずかしい間違いだと思いますが、これを理解しようとしてもどこにも行きません。関数から値を返すコメント行に int main と int getNextNumber を含めました。

int getNextNumber(std::string& iExpression, int& ioLoopShift, bool& ioIsValidExpression)
{
    //spaces are ignored, a minus is a unary minus (so must be seated next to a number (no spaces between '-' and number))
    int length = iExpression.size(); //evaluate only once
    bool unaryMinusFound = false;
    bool numberFound = false;

    int oSubExpression = 0;
    for(int i =0; i < length; i++)
    {
        if((int)iExpression[i] == 32)
        {
            if(!numberFound)
            {
                if(!unaryMinusFound)
                {
                    continue;
                }
                else
                {
                    ioIsValidExpression = false;
                    td::cout << "address of ioIsValidExpression: " << &ioIsValidExpression << ", value: " << ioIsValidExpression << "\n";
                    return 0;
                }
            }
            else
            {
                return unaryMinusFound? -1 * oSubExpression: oSubExpression;
            }
        }
        if((int)iExpression[i] == 45 && !unaryMinusFound)
        {
            unaryMinusFound = true;
            continue;
        }
        if((int)iExpression[i] >= 48 && (int)iExpression[i] <= 57)
        {
            numberFound = true;
            oSubExpression = (int)(iExpression[i]-48) + 10*oSubExpression;
            ioLoopShift++;
            continue;
        }
        else
        {
            //garbage characters
            ioIsValidExpression = false;
            return 0;
        }
    }
    return unaryMinusFound? -1 * oSubExpression: oSubExpression;
}

整数メイン:

int main(int argc, char* argv[])
{
    std::string test = " - 45 & ";
    int test2 = 0;
    bool test3 = true;
    std::cout << getNextNumber(test,test2,test3) << ", address of test3: " << &test3 << ", value: " << test3 << "\n";

    return 0;
}

プログラムの実行による出力:

address of ioIsValidExpression: 0xbf86e58f, value: 0
0, address of test3: 0xbf86e58f, value: 1
4

1 に答える 1

4

関数の引数 (および出力ステートメントは関数のチェーン) が評価される順序は規定されていません。すべてを出力する前に関数の結果を変数に保持すると、どのように正しく動作するかを考えてみましょう: test

int temp = getNextNumber(test, test2, test3);
std::cout << temp << ", address of test3: " << &test3 << ", value: " << test3 << "\n";

出力:

ioIsValidExpression のアドレス: 0xbfaa85cf、値: 0
0、test3 のアドレス: 0xbfaa85cf、値: 0

于 2012-10-28T18:15:21.463 に答える