LINUX.ORG.RU

Попытки понять с++ остановились на этом.

 


0

1
void F(int &a)
 {
    a = 100;
}

int F1(int &a) {
    a = 100;
    return a;
}

int main()
{
    
    setlocale(LC_ALL, "Russian");
    int a = 5;
    F(a);
    cout << a<<endl;//Выводит 100 как я того ожидал
    a = 5;
    cout<<F1(a)<<" "<<a;//Выводит 100 и 5 не изменяя а
    return 0;
}

Хотелось бы узнать почему не изменяется значение а в F1.



Последнее исправление: cetjs2 (всего исправлений: 2)

using namespace std;

int F(int g, int it)
{
    cout << "g = " << g << "; it = " << it << endl;
    
    return g;
}

int main()
{
    int i = 0;
    cout << F(1, ++i) << " " << F(2, ++i) << " " << F(3, ++i) << " " << F(4, ++i) << endl;
    
    return 0;
}

результат:

g = 4; it = 1
g = 3; it = 2
g = 2; it = 3
g = 1; it = 4
1 2 3 4

т.е. справа налево вызываются функции. А вообще, это неопределённое поведение:

There’s no order defined for evaluating arguments. The compiler is free to evaluate arguments in any order, and will normally choose the most convenient order. So, you can’t define any expected output.

anonymous
()
Ответ на: комментарий от anonymous

UB до C++17

Но UB, которое Unspecified Behaviour (порядок вычисления аргументов функции не определён), а не Undefined Behaviour (всё очень плохо).

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Но UB, которое Unspecified Behaviour

Нет, которое Undefined Behavior.

C++14 [expr.call]/8:

The evaluations of the postfix expression and of the arguments are all unsequenced relative to one another.

Все эти ++i — unsequenced по отношению друг к другу.

C++14 [intro.execution]/15

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, and they are not potentially concurrent ([intro.multithread]), the behavior is undefined.

anonymous
()

не изменяя а

На будущее, так можно думать, только выведя a в следующей строке и увидев 5. Все проблемы с отладкой стоят на столпах неверных предположений.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.