如果不满足循环条件,如何执行一段代码?

时间:2020-04-22 22:20:15

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

假设我有一棵树,我想从当前节点继续往左走。如果当前节点没有剩余,我想继续往右走。否则返回。要做类似的事情,我必须写这样的东西:

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 (...) ...
else if (...) ... 
else while (...) ...
else ...

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

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:0)

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

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

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

然后无条件跟随该分支,如下所示:

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

通常,当您有两个相同的代码段时,您必须根据具体情况决定可以抽象出哪些部分,以及是否对代码进行改进。