【问题标题】:How to execute a piece of code if the condition of a loop is not met?如果不满足循环条件,如何执行一段代码?
【发布时间】:2020-08-06 02:50:48
【问题描述】:

假设我有一棵树,我想从当前节点继续向左移动。如果当前节点没有左边,我想继续往右走。否则返回。为了做这样的事情,我必须写这样的东西:

if (node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;

如您所见,我必须写两次条件。我可以这样写吗:

while (node->left != nullptr)
    node = node->left;
else while (node->right != nullptr)
    node = node->right;
else return;

如果我可以在 if 中使用 while 也会很有帮助。像这样的:

while (...) ...
else if (...) ... 
else while (...) ...
else ...

编辑: 刚刚意识到树的例子不是一个好例子。但一般情况下我可以做这样的事情吗?

【问题讨论】:

  • 只用第一个例子?
  • while 不返回布尔值,因此它不能用于if 条件。
  • @KenWhite 我并不是说将其用作条件。我是说将它与if 语句一起使用。
  • if 语句需要条件。
  • 可能有一种方法可以通过充分滥用宏和 lambdas 等来获得类似的东西。然后你就会有你喜欢的东西,但没有其他人可以轻松阅读。

标签: c++ loops if-statement while-loop conditional-statements


【解决方案1】:

我的意思是,这将满足您的要求

if (node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;

但最好检查一下node 不是nullptr(如果你以前没有这样做的话)

if (node && node->left != nullptr)
    while (node->left != nullptr)
        node = node->left;
else if (node && node->right != nullptr)
    while (node->right != nullptr)
        node = node->right;
else return;

【讨论】:

  • 不等价。如果多次向左踩,然后向右踩怎么办?最初的步骤要么左一些,要么右一些,从不两者兼而有之。
  • @aschepler 抱歉,从问题中我了解到,在没有左孩子之后,您首先要向左直行,然后向右直行
  • @aschepler 但我的意思是,这个问题的意义何在?......编写这 3 行代码的“更短的方法”?
【解决方案2】:

是的,在这种情况下这当然是可能的。事实上,您甚至可以避免将ifwhile 写两次。

请注意,代码片段之间的唯一区别是 正在使用 Node 成员(即您是向左还是向右分支)。因此,根据您要遵循的分支,您可以获取指向该成员的指针,如下所示:

Node* Node::* branch = node->left != nullptr ? &Node::left : &Node::right;

然后无条件地跟随那个分支,像这样:

while (node->*branch != nullptr)
    node = node->*branch;

一般来说,当您有两段相同的代码时,您必须根据具体情况决定其中哪些部分可以抽象,以及生成的代码是否会被它改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多