在函数参数未定义的行为中使用赋值运算符?

时间:2016-02-02 12:13:24

标签: c++ undefined-behavior operator-precedence

我在大学导师写的一个例子中找到了类似的代码。

int main(){
    int a=3;
    int b=5;
    std::vector<int>arr;
    arr.push_back(a*=b);
    std::cout<<arr[0]<<std::endl;
}

这有明确定义的行为吗? arr[0]会是3还是15(或其他完全不同的东西)? Visual Studio输出15,但我不知道其他编译器是否会响应它。

3 个答案:

答案 0 :(得分:4)

在执行push_back之前,需要计算作为参数传递的表达式。那么a *= b的价值是多少?好吧,它始终是a * b,并且a的新值也将设置为该值。

答案 1 :(得分:3)

它有效且按预期工作。

首先评估表达式,结果是&#34;返回&#34;。

auto& temp = (a*=b);
arr.push_back(temp);

答案 2 :(得分:1)

带有复合赋值运算符的表达式的值是赋值后左操作数的值。 所以你展示的代码是有效的。此外,在C ++中(与C相反),结果是lvalue。所以你甚至可以写:)

arr.push_back( ++( a *= b ) );

在这种情况下,下一个语句输出16。:)