Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++;,当表达式涉及某个对象时,将表达式赋给该对象时,是否有定义的操作顺序? 考虑以下C++代码,使用Qt的容器类 QMap < /C> >: #include <QMap> #include <iostream> QMap<int, int> myMap; int count() { return myMap.size(); } int main() { myMap[0] = count(); std::cout << myMap[0] << std::endl; return 0; } #包括 #包括 QMap-myMap; 整数计数(){ 返回myMap.size(); } int main(){ myMap[0]=count(); std::cout_C++_Qt_Operator Precedence - Fatal编程技术网

在C++;,当表达式涉及某个对象时,将表达式赋给该对象时,是否有定义的操作顺序? 考虑以下C++代码,使用Qt的容器类 QMap < /C> >: #include <QMap> #include <iostream> QMap<int, int> myMap; int count() { return myMap.size(); } int main() { myMap[0] = count(); std::cout << myMap[0] << std::endl; return 0; } #包括 #包括 QMap-myMap; 整数计数(){ 返回myMap.size(); } int main(){ myMap[0]=count(); std::cout

在C++;,当表达式涉及某个对象时,将表达式赋给该对象时,是否有定义的操作顺序? 考虑以下C++代码,使用Qt的容器类 QMap < /C> >: #include <QMap> #include <iostream> QMap<int, int> myMap; int count() { return myMap.size(); } int main() { myMap[0] = count(); std::cout << myMap[0] << std::endl; return 0; } #包括 #包括 QMap-myMap; 整数计数(){ 返回myMap.size(); } int main(){ myMap[0]=count(); std::cout,c++,qt,operator-precedence,C++,Qt,Operator Precedence,可以首先计算赋值的任何一方。它类似于函数调用(如果您重载了赋值运算符,实际上可能是函数调用),例如: 其中a或b可首先进行评估 这并不一定特定于特定的编译器-同一个编译器可能会在不同的情况下选择不同的求值顺序。不幸的是,据我所知,与Python等语言不同,对于求值顺序,给定的编译器、编译器版本或库都没有定义顺序结束于未定义的行为 但是,编译器必须遵守一些规则:这不是其中之一。它们给出的未定义行为示例与您的示例类似: a[i] = i++; 你的问题在这里: myMap[0] = count(

可以首先计算赋值的任何一方。它类似于函数调用(如果您重载了赋值运算符,实际上可能是函数调用),例如:

其中a或b可首先进行评估


这并不一定特定于特定的编译器-同一个编译器可能会在不同的情况下选择不同的求值顺序。

不幸的是,据我所知,与Python等语言不同,对于求值顺序,给定的编译器、编译器版本或库都没有定义顺序结束于未定义的行为

但是,编译器必须遵守一些规则:这不是其中之一。它们给出的未定义行为示例与您的示例类似:

a[i] = i++; 
你的问题在这里:

myMap[0] = count();
整个赋值是一个表达式,对
count()
的调用是一个子表达式。表达式和子表达式之间没有序列点

这不是关于评估顺序,而是关于副作用的顺序。作业有副作用,在这种情况下,它会向
QMap
添加一个新元素。只有在序列点上,您才能保证在序列点完成之前由代码产生的所有副作用

函数调用是一个序列点,但它位于函数参数的求值和实际调用之间——与返回值无关。因为这里没有任何参数,所以在这种情况下不适用

因此,是的,这是未定义的行为,您应该避免它。作为参考



解决方案当然很简单:使用两个单独的语句。语句的结尾(
)始终是一个序列点。

感谢您的详细解释。当然,您的解决方案是正确的,我在代码中实现了什么。
myMap[0] = count();