C++ 这是如何评估的?
我觉得问这个问题很愚蠢。但我自己也无法找出原因C++ 这是如何评估的?,c++,C++,我觉得问这个问题很愚蠢。但我自己也无法找出原因 int main() { int target; int buffer =10; const int source = 15; target = (buffer+=source) = 20; cout << target+buffer; return 0; } intmain() { int目标; int缓冲区=10; const int source=15; 目标=(缓冲区+=源)=2
int main()
{
int target;
int buffer =10;
const int source = 15;
target = (buffer+=source) = 20;
cout << target+buffer;
return 0;
}
intmain()
{
int目标;
int缓冲区=10;
const int source=15;
目标=(缓冲区+=源)=20;
库特
某些预定义运算符(如+=)要求操作数为
适用于基本类型时的左值[§13.5/7]
buffer+=source
返回对buffer
的左值引用,因此您没有编译错误。
您的陈述可以评估为:
buffer+=source;
buffer=20;
target=20;
但是在一个语句中修改缓冲区两次是未定义的行为,另一个编译器可能会对结果进行其他计算。(在这种情况下也不确定!)使用调试器进行调试会对您有所帮助。您不是,是吗?我很确定这是由于排序而未定义的行为。@Bathsheba的括号不足以确保正确的排序?@Dariusz不,括号只确保关联性。@jrok:谢谢,我一开始没有注意到。已编辑。不要太快感谢我,我会的“我实际上不再确定了。”“在所有情况下,赋值都是在左右操作数的值计算之后,赋值表达式的值计算之前排序的。我很确定它在C++03中是未定义的,但这段引语来自C++11。@jrok:所以你可以在So中提出一个关于这一点的好问题,你有我的+1:-)