我是 C++ 新手。当我在Clion中调试时,我发现使用Step over(F8)的执行顺序与实际代码的顺序不符。到目前为止,我认为最可能的原因是编译器优化。我不认为我已启用此功能并且正在使用 LLDB 进行调试。
这似乎与这个答案相关: 为什么我的断点没有按顺序运行? GCC 和 C
这是我的代码:
int depthSum(vector<NestedInteger> &nestedList) {
deque<pair<int, NestedInteger>> q;
int level = 1;
for (NestedInteger n : nestedList) {
q.push_back({ level, n});
}
int res = 0;
while (!q.empty()) {
auto pair = q.front();
q.pop_front();
if (pair.second.isInteger()) {
level--;
res = (level * (pair.second.getInteger()));
cout << res << endl;
} else {
level++;
for (NestedInteger nestedInteger : pair.second.getList()) {
q.push_front({level, nestedInteger});
}
}
}
return res;
}
当断点步到
res = (level * (pair.second.getInteger()));
处再按F8会跳转回level--
,再按F8跳转到res = (level * (pair.second.getInteger()));
,再次按F8会跳转到cout << res << endl;
这真的是因为代码重新排序吗?顺便说一句,虽然调试顺序与预期不符,但代码逻辑没有错误,但我在项目中没有找到一些开放的代码优化选项。
我试图避免优化,但问题仍然存在。
----------------------------已更新
这是有效的,但我不知道为什么 -O0 不起作用。从逻辑上讲 -O0 应该有效,因为这避免了所有优化。
-DCMAKE_C_FLAGS_DEBUG:STRING="-g -O1" -DCMAKE_CXX_FLAGS_DEBUG:STRING="-g -O1"
您可能处于发布模式配置... 所以将其更改为调试模式