我在大学导师写的一个例子中找到了类似的代码。
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,但我不知道其他编译器是否会响应它。
答案 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
。:)