我的代码似乎以错误的顺序执行

时间:2015-11-18 12:23:08

标签: c++

我写了一个打印功能如下。

#define NDEBUG
void print(vector<int> &vec)
{
#ifdef NDEBUG
    std::cout << "vector size: " << vec.size() << std::endl;
#endif
    if (!vec.empty())
    {
        auto temp = vec.back();
        vec.pop_back();
        print(vec);
        std::cout << temp<<std::endl;

    }
}

打印:

vector sise:6
vector sise:5
vector sise:4
vector sise:3
vector sise:2
vector sise:1
vector sise:0
1
2
3
4
5
6

但我希望它类似于:

vector sise:6
6
vector sise:5
5
vector sise:4
4
vector sise:3
3
vector sise:2
2
vector sise:1
1
vector sise:0

是因为线程的优先级?如果是,我如何控制正确的执行顺序作为我的代码?

2 个答案:

答案 0 :(得分:3)

<强>解决方案

以下几行被颠倒了:

    print(vec);
    std::cout << temp<<std::endl;

他们应该是:

    std::cout << temp<<std::endl;
    print(vec);

<强>原理

如果在输入向量大小为6时查看代码,则首先输出大小:

std::cout << "vector size: " << vec.size() << std::endl;

然后你会递归地调用你的函数:

    print(vec);

只有在这个递归调用返回后才打印第6项:

    std::cout << temp<<std::endl;

然后你从你的功能返回。所以很明显,第6个项目将打印到最后。相同的推理适用于递归调用并解释您的输出。

答案 1 :(得分:3)

在输出print之前递归调用temp。可以这样想(用一个小例子):

print vec(2)
    cout size: 2
    print vec(1)
    cout size: 1
        print vec(0)
        cout size: 0
    cout 1
cout 2

你需要在递归之前输出:

std::cout << temp << std::endl;
print(vec);