【问题标题】:Why can't I use a "break" statement inside a ternary conditional statement in C++?为什么我不能在 C++ 的三元条件语句中使用“break”语句?
【发布时间】:2015-04-22 22:35:42
【问题描述】:

Node 是一个非常简单的类,只有一个构造函数和几个变量:一个“名称”(实际上只是一个字符)和两个名为“left”和“right”的子节点指针。

我刚开始写一些需要放到最左边节点的代码,当我想到这个时我很高兴:

Node *current = this->root;
while (true) (current->left != nullptr) ? current = current->left : break;

看起来很简单:在无限循环中,检查 current 是否有左孩子,如果有,则将 current 设置为该左孩子,如果没有,则跳出循环。这是一个很酷的小单行,不太难读。 (我评论了它!)

好吧,我的编译器不喜欢它:

iterator.cpp:20:70: error: expected expression
    while (true) (current->left != nullptr) ? current = current->left : break;
                                                                        ^
1 error generated.

此外,只是在 while 循环中添加一些大括号并将三元运算符移动到它自己的行并没有帮助(不足为奇)。我必须把它变成一个 if/else 让编译器接受它。

有人能解释一下它是如何解释单行的以及它为什么反对吗?

【问题讨论】:

  • 条件 表达式 不是“语句”。这是一个表达式。 break 不是一个表达式。这是一个声明。您不能将语句放在表达式中。

标签: c++ data-structures binary-tree ternary-operator


【解决方案1】:

为什么我不能在 C++ 的三元条件语句中使用“break”语句?

因为三元运算符根本不是语句,它是运算符,它由表达式组成,而不是语句。 break 是语句,而不是表达式。

【讨论】:

    【解决方案2】:

    三元条件运算符是将多个表达式组合成一个更大的表达式的运算符。 break 是一个语句而不是一个表达式,所以它不能在三元条件表达式中使用。

    不过,您可以像这样重写您的代码:

    while (current->left != nullptr) current = current->left;
    

    希望这会有所帮助!

    【讨论】:

    • 我刚回来说我这样做了,因为它更干净。但我仍然对break 问题感到好奇。我能否以某种方式将break 嵌入到表达式中,例如(break);
    • @KingSpook 不。 break 是一个语句,因此您只能在需要语句的情况下使用它。表达式可以用括号括起来,因为break 不是表达式,所以不能用括号括起来。 if/else?: 之间的主要区别在于 if/else 适用于 语句?: 适用于 表达式
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2016-05-12
    相关资源
    最近更新 更多