在向量中用作索引的函数内部更改变量

时间:2017-10-17 07:55:36

标签: c++ vector indexing

有人可以了解这些情况下可能发生的事情(使用案例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;
}

3 个答案:

答案 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()初始化`,然后你评估两个中的表达式下一行并继续进行分配)。