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

Why can't I use a "break" statement inside a ternary conditional statement in C++?

Node 是一个非常简单的 class,只有一个构造函数和一些变量:一个 "name"(实际上只是一个字符)和两个 child 节点指针,称为 "left" 和 "right".

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

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

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

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

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

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

有人可以解释一下它是如何解释 one-liner 以及为什么要解释 objects 的吗?

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

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

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

希望对您有所帮助!

Why can't I use a “break” statement inside a ternary conditional statement in C++?

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