C++;计算while语句中的基础if条件 我有一个问题,当C++评估while语句时,即使不满足while语句条件,它也会对基础if语句进行评估。
ite_候选对象是二进制映射树上的自定义迭代器。当没有更多节点可访问时,ite_candidate的计算结果为NULL。所以这段时间结束了。但是,我从ite_candidates.clecourante()调用中得到一个断言失败,说我的底层节点为NULL。它不应该评估ite_候选人。clecourante(),因为它不是为了达到目的 我在调试模式下运行程序,并且!!当没有更多节点可访问时,ite_候选节点的计算结果实际上为false。如果我注释掉If块,程序就会退出while循环,一切正常 ite_候选运算符bool()的运算符重载不调用clecourante()C++;计算while语句中的基础if条件 我有一个问题,当C++评估while语句时,即使不满足while语句条件,它也会对基础if语句进行评估。,c++,if-statement,while-loop,operator-overloading,logic,C++,If Statement,While Loop,Operator Overloading,Logic,ite_候选对象是二进制映射树上的自定义迭代器。当没有更多节点可访问时,ite_candidate的计算结果为NULL。所以这段时间结束了。但是,我从ite_candidates.clecourante()调用中得到一个断言失败,说我的底层节点为NULL。它不应该评估ite_候选人。clecourante(),因为它不是为了达到目的 我在调试模式下运行程序,并且!!当没有更多节点可访问时,ite_候选节点的计算结果实际上为false。如果我注释掉If块,程序就会退出while循环,一切正常 it
这是不可能的。如果它计算
如果
,则在时进入。没有预先计算是C++
另外,为什么在中有两个否定,而中有两个否定?粗略猜测:ite_候选项在代码中递增。可能结束迭代器的计算结果不是0
ite_候选对象是二进制映射树上的自定义迭代器。当没有更多节点可访问时,ite_candidate的计算结果为NULL
它真的计算为NULL吗?这有点可疑,因为在ite\u candidates.clecourante()
中使用的是点运算符而不是解引用运算符。从您发布的代码来看,它看起来像是某个对象的实例,而不是指向某个对象的指针
iteu候选算子bool()的算子重载
我怀疑这就是问题所在。你的!!ite_候选对象
将使用该转换运算符将ite_候选对象
转换为一个bool
,对该结果求反以生成!如果候选人
,则再次否定以产生
!!ite_候选人
问题在于,您的
运算符bool()
正在检查与任何自定义迭代器类名的前提条件不同的条件::clecourante()
双精度!!是一种将非bool值转换为bool值的快速而肮脏的方法。也许这两个否定是OP认为它错误地计算if语句的原因?while语句被调用了?@Mike但是为什么他想将iteu候选对象
转换为bool
?@Dims我能想到的唯一可能性是iteu候选对象超载了
运算符,因此只能通过双重求反将其转换为布尔值。尽管我不认为我在实际代码中见过这种情况。@Lunfel,这一点无论如何都不清楚。您不需要在C++
中转换为bool
,它会自动将0
和NULL
视为false。此外,您最好编写一些明确的内容,如ite\u candidates.hasNext()
或ite\u candidates!=如果它是指针,则为NULL。while(false)expr代码>永远不会计算expr
。你需要更深入地回顾你的代码,因为你的前提是不正确的。看看上面的代码,我怀疑循环体被调用了,而你的循环控制被关闭了…如果它进入循环,那么!!ite_候选人
为真
。如果没有,则为false
。我想你需要发布一个小的、完整的、可编译的例子来解决这个问题。要么是代码中的某些细微之处导致了这种行为,要么是您误解了某些内容,要么是编译器出现了错误(不太可能,但确实发生了)。在任何情况下,细节都很重要。我已经添加了一个cout
while(!!ite_candidats){
if(ite_candidats.clecourante() != nompersonne){
{...}
}
ite_candidats++;
}