vector<pair<int, int>> list;
int a = 0;
list.emplace_back(a, a++);
以上代码为啥list末尾插入的结果是{1, 0}?
如果++是前一个的后缀,即:list.emplace_back(a++, a); 则list末尾插入的是{0, 1}。
引用 皆我百晓生 小程序回复内容作答:
这是因为在 list.emplace_back(a, a++)
中,a
作为函数的参数传递时,可能先计算 a++
之后再传递参数 a
。这意味着 a++
的结果在 emplace_back
函数执行之前就已经被改变了。
所以,实际发生的顺序是:
a
被传递给 emplace_back
函数,并被保存在 pair
的第一个元素中;a++
被执行,将 a
的值从0增加到1。因此,emplace_back
执行时,第一个元素是0,第二个元素是1,导致最终的结果是 {1, 0}
。
你使用了UB代码, C++从没有保证函数参数的求值顺序, 如果有教材教你这么干, 扔掉, 免得祸害日后的同僚.
【以下回答由 GPT 生成】
在这段代码中,list.emplace_back(a, a++)
会导致list末尾插入的结果是{1, 0}。这是因为在C++中,在函数调用时,具有多个参数的函数的参数求值顺序是未定义的,也就是说,编译器无法保证参数的求值顺序。
对于list.emplace_back(a, a++)
这个语句来说,首先会拷贝a值作为pair的第一个元素,然后a会自增。但是,具有多个参数的函数的参数求值顺序是未定义的,所以在这里不能保证a++在a之前执行。
根据未定义行为,可以有不同的结果。在这个例子中,很可能是先拷贝a值作为pair的第一个元素(此时a是0),然后a自增(此时a变成了1),最后将a(此时a是1)作为pair的第二个元素。
如果你希望得到结果{0, 0},可以使用后缀运算符++,即list.emplace_back(a++, a);
。这样可以保证a会先拷贝作为pair的第一个元素,然后再自增。