Почему я не могу использовать оператор «break» внутри тернарного условного оператора в C ++?

Узел – очень простой class с просто конструктором и несколькими переменными: «имя» (фактически только символ) и два указателя на дочерние узлы, называемые «левыми» и «правыми».

Я только начал писать код, который нужно отбросить на самый левый узел, и я был очень доволен, когда я придумал это:

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

Кажется, достаточно просто: в бесконечном цикле проверьте, не имеет ли ток левого ребенка, если это так, установите ток в этот левый дочерний элемент, если нет, выйдете из цикла. Это classный маленький лайнер, не слишком нечитаемый. (И я прокомментировал это!)

Ну, моему компилятору это не нравится:

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

Кроме того, просто бросать некоторые фигурные скобки в цикл while и перемещать тернарный оператор на собственную линию не помогло (неудивительно). Мне пришлось превратить его в if / else, чтобы компилятор мог его принять.

Может кто-нибудь объяснить, как он интерпретирует однострочный и почему он объективно?

Тернарный условный оператор является оператором, который объединяет несколько выражений в большее выражение. break – это выражение, а не выражение , поэтому его нельзя использовать внутри тернарного условного выражения.

Вы могли бы, однако, переписать свой код следующим образом:

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

Надеюсь это поможет!

Почему я не могу использовать оператор «break» внутри тернарного условного оператора в C ++?

Поскольку тернарный оператор вообще не является выражением, он является оператором и состоит из выражений, а не операторов. break – это утверждение, а не выражение.

  • Почему не может использоваться функция, не являющаяся членом, для перегрузки оператора присваивания?
  • Давайте будем гением компьютера.