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

Is using an assignment operator in a function argument undefined behaviour?

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

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,但我不知道其他编译器是否会这样响应它。

它是有效的,如您所愿。

首先对表达式求值,结果为"returned"。

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

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

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

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

在这种情况下,下一条语句输出 16.:)