【问题标题】:C++ evaluates underlying if condition in a while statementC++ 在 while 语句中评估底层 if 条件
【发布时间】:2012-12-07 18:07:46
【问题描述】:

我有一个问题,当 c++ 评估 while 语句时,即使不满足 while 语句条件,它也会评估底层 if 语句。

ite_candidats 是二叉映射树上的自定义迭代器。当没有更多节点可以访问时,ite_candidat 评估为 NULL。所以这段时间就结束了。但是,我从 ite_candidats.clecourante() 调用中得到一个断言失败,说我的底层节点是 NULL。它不应该评估 ite_candidats.clecourante() 因为它不是为了得到它。

我在调试模式下运行程序,当没有更多节点可以访问时,!!ite_candidats 的计算结果为 false。如果我注释掉 if 块,程序就会退出 while 循环,一切正常...

ite_candidats operator bool() 的运算符重载不会调用 clecourante()。

while(!!ite_candidats){
    if(ite_candidats.clecourante() != nompersonne){
        {...}
    }
    ite_candidats++;
}

【问题讨论】:

  • while (false) expr; 永远不会评估 expr。您需要更深入地回顾一下您的代码,因为您的前提不正确。
  • 单步调试器或在循环体中加入 printf 并验证循环体未被调用。只看上面的代码,我怀疑循环体被调用并且你的循环控制关闭了......
  • 如果它进入循环,那么!!ite_candidats就是true。如果没有,那就是false。期间。
  • 我认为您需要发布一个小的、完整的、可编译的示例来产生问题。您的代码中有一些微妙的东西导致了这种行为,您误解了某些东西,或者存在编译器错误(不太可能,但确实会发生)。无论如何,细节很重要。
  • 我在 clecourante() 方法中添加了一个 cout

标签: c++ if-statement while-loop operator-overloading logic


【解决方案1】:

这是不可能的。如果它评估if,则它进入while。没有提前计算是C++

附:为什么while中有两个否定句?

【讨论】:

  • 双倍!!是将非布尔值转换为布尔值的一种快速而肮脏的方法。
  • 也许这两个否定是为什么 OP 认为它错误地评估了 if 语句?正在调用 while 语句?
  • @Mike 但他想将ite_candidats 转换为bool 做什么?
  • @Dims 我能想到的唯一可能是 ite_candidats 重载了! 运算符,因此只能通过双重否定将其转换为布尔值。虽然我认为我从未在实际代码中看到过。
  • @Lunfel,这无论如何都不清楚。您无需在C++ 中转换为bool,它会自动将0NULL 设为false。另外你最好写一些明确的东西,比如ite_candidats.hasNext()ite_candidats != NULL,如果它是一个指针的话。
【解决方案2】:

粗略猜测:ite_candidats 在代码中递增。可能结束迭代器没有评估为 0。

【讨论】:

    【解决方案3】:

    ite_candidats 是二叉映射树上的自定义迭代器。当没有更多节点可以访问时,ite_candidat 评估为 NULL。

    它真的评估为 NULL 吗?这有点可疑,因为您在 ite_candidats.clecourante() 中使用的是点运算符而不是取消引用运算符。从您发布的代码来看,ite_candidats 似乎是某个对象的实例,而不是指向某个对象的指针。

    ite_candidats operator bool()的运算符重载

    我怀疑这就是问题所在。您的!!ite_candidats 将使用该转换运算符将ite_candidats 转换为bool,否定该结果以产生!ite_candidats,然后再次否定以产生!!ite_candidats

    问题是您的operator bool() 正在检查与WhatEverYourCustomIteratorClassIsNamed::clecourante() 的先决条件不同的条件。

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多