有人可以了解这些情况下可能发生的事情(使用案例1或案例2)以及为什么它会产生不同的结果:
案例1:
currentIndex = 1
vec = {1, 0, 0}
案例2:
currentIndex = 1
vec = {0, 1, 0}
代码:
#include <iostream>
#include <vector>
using namespace std;
uint currentIndex = 0;
uint testFunc()
{
currentIndex++;
return 1;
}
int main()
{
vector<uint> vec(3, 0);
// *********************************
// Case 1:
//vec[currentIndex] = testFunc();
// Case 2:
//uint result = testFunc();
//vec[currentIndex] = result;
// *********************************
cout << "currentIndex = " << currentIndex << endl;
cout << "vec = {" << vec[0] << ", " << vec[1] << ", " << vec[2] << "}" << endl;
return 0;
}
答案 0 :(得分:4)
C ++ 11引入了一个模型,其中某些操作排序。例如,当操作A在操作B之前被排序时,则A在B之前完全发生。
现在可能会对某些操作进行排序,但顺序不确定。这意味着A要么在B之前完全发生,要么在完全之后发生。案例1就是一个例子。 std::vector::operator[]
的调用是针对testFunc
的调用排序的,但是他们的顺序未指定。两者都在作业之前进行了排序,但这就是你所能说的。
在案例2中,您有顺序语句。顺序语句按它们出现的顺序排序,因此第一个语句在第二个语句开始之前完全完成。这也意味着第一个语句中的testFunc
在第二个语句的operator[]
开始之前完成。
答案 1 :(得分:2)
简短的回答是:不要这样做。
更合理的答案是:这是首先评估的问题:容器或函数的索引。在第二种情况下,这是明确定义的,在第一种情况下,不是因为变量在没有sequence point的情况下被改变和使用,即使在函数内部改变了变量。
简短回答(不要这样做)的原因是你使用了一个全局变量,你在一个不相关的函数中隐藏了全局变量的访问/变异,你在同一个语句中调用了这个函数在哪里使用变量作为索引。
答案 2 :(得分:1)
在第一种情况下,谁知道何时评估gdbus-codegen
?在调用vec[currentIndex]
之前或之后?
相反,第二种情况明确执行所需的步骤,以便可以先判断程序的流程(首先调用函数,testFunc()
初始化`,然后你评估两个中的表达式下一行并继续进行分配)。