[英]My code seems to execute in a wrong order
我寫了一個打印功能如下。
#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
是因為線程的優先級? 如果是,我如何控制正確的執行順序作為我的代碼?
解決方案
以下幾行被倒置:
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 項將最后打印。 同樣的推理適用於遞歸調用並解釋您的輸出。
在輸出temp
之前遞歸調用print
。 可以這樣想(舉一個較小的例子):
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.