C++;计算while语句中的基础if条件 我有一个问题,当C++评估while语句时,即使不满足while语句条件,它也会对基础if语句进行评估。

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

ite_候选对象是二进制映射树上的自定义迭代器。当没有更多节点可访问时,ite_candidate的计算结果为NULL。所以这段时间结束了。但是,我从ite_candidates.clecourante()调用中得到一个断言失败,说我的底层节点为NULL。它不应该评估ite_候选人。clecourante(),因为它不是为了达到目的

我在调试模式下运行程序,并且!!当没有更多节点可访问时,ite_候选节点的计算结果实际上为false。如果我注释掉If块,程序就会退出while循环,一切正常

ite_候选运算符bool()的运算符重载不调用clecourante()


这是不可能的。如果它计算
如果
,则在时进入
。没有预先计算是
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++;
}