3

なぜこれが機能するのか理解しています

#include <iostream>
using namespace std;

int additionFive (int a)
{
    a = a - 5;
    return a;
}

int subtractFive (int &a)
{
    a = a -5;
    return a;
}

int main()
{
    int local_A = 10;

    cout << "Answer: " << additionFive(local_A) << endl;
    cout << "local_A Value "<< local_A << endl;

    cout << "Answer: " << subtractFive(local_A) << endl;
    cout << "local_A = Value "<< local_A << endl;

    return 0;
}

出力:

Answer: 5
local_A Value 10
Answer: 5
local_A = Value 5

しかし、この構文の変更により答えが変わる理由がわかりません(単に算術と出力を同じ行に置くだけです)

#include <iostream>
using namespace std;

int additionFive (int a)
{
    a = a - 5;
    return a;
}

int subtractFive (int &a)
{
    a = a -5;
    return a;
}

int main()
{
    int local_A = 10;

    cout << "Answer: " << additionFive(local_A) << " local_A Value: "<< local_A << endl;
    cout << "Answer: " << subtractFive(local_A) << " local_A = Value: "<< local_A << endl;

    return 0;
}

出力:

Answer: 5 local_A Value: 10
Answer: 5 local_A = Value: 10
4

2 に答える 2

5

未定義の動作が発生しています。a2 番目のバージョンは、2 番目のバージョンで読み取っている値をcout2 回変更します。読み取りの間にシーケンス ポイントはありません。

最初のバージョン:

cout << "Answer: " << subtractFive(local_A) << endl;
//                              |                  |
//                  reads and modifies local_A     |
//                                           sequence point
cout << "local_A Value ="<< local_A << endl;
//                             |
//                       reads local_A

2 番目のバージョン:

cout << "Answer: " << subtractFive(local_A) << " local_A Value: "<< local_A << endl;
//                             |                                       |
//                  reads and modifies local_A                   reads local_A
于 2012-12-13T19:46:52.053 に答える
0

2 番目のコードの動作は、完全にシステム/コンパイラに依存します。Dev C++ では、2 番目のコードは最初のコードと同じ出力を提供しています。コンパイラがプログラムアセンブリで cout ステートメントをどのように構築するかによって異なります...

于 2012-12-13T20:01:10.267 に答える