首先是本题在搜索部分的一段代码,出现奇怪的问题。
if(idx==0) for(int i=1;i<=m;i++) if(f[i]>0) qn.push(qnode{i,f[i]});
else{
cout<<"haha "<<idx<<endl;
for(int i=1;i<m;i++){
if(f[i]>0){
qn.push(qnode{i+1,f[i]+w[idx]});
f[i]=-1;
}
}
qn.push(qnode{1,w[idx]});
}
f[m]=-1;
return qn;
显然在idx=0(即根节点)时会进入上面的if,不会进入下面的else(这只是人类的理解方式)。但离奇的事情发生了,程序居然输出了 "haha 0" 。
然后我又写了一份格式差不多的测试代码:
#include<iostream>
using namespace std;
int main(){
int a=0;
if(a==0) for(int i=1;i<=10;i++) if(i%2) cout<<"haha "<<i<<endl;
else cout<<a<<" 问题在这 "<<i<<endl;
else cout<<"huhu"<<endl;
return 0;
}
其输出为:
haha 1
0 问题在这 2
haha 3
0 问题在这 4
haha 5
0 问题在这 6
haha 7
0 问题在这 8
haha 9
0 问题在这 10
现在可以发现问题所在了:编译器认为,下方的 else 与最内层判断奇偶的 if 同级,而非人类理解的判断 a 的 if 。
这是因为程序是用栈模拟的嵌套循环,会把右侧同级的所有判断同级运行吗?
有知道的读者可以回复一下,谢谢。