C ++ Pass by Reference и Pass by Value Функции побочный эффект?

Я понимаю, почему это работает так, как работает

#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

3

Решение

Вы сталкиваетесь с неопределенное поведение. Вторая версия изменяет значение a который вы читаете во втором cout 2 раза, без последовательных точек между чтениями.

Первая версия:

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

Вторая версия:

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

Другие решения

Хорошо, поведение второго кода полностью зависит от системы / компилятора. На Dev C ++ второй код выдает тот же вывод, что и первый. Это зависит от того, как компилятор создает оператор cout при сборке программы …

0

По вопросам рекламы [email protected]