在函数参数未定义行为中使用赋值运算符吗?
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
.:)
我在大学导师写的一个例子中找到了一些类似的代码。
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
.:)