c++ data-structures binary-tree ternary-operator

¿Por qué no puedo usar una declaración de "interrupción" dentro de una declaración condicional ternaria en C++?



data-structures binary-tree (2)

Node es una clase muy simple con un solo constructor y algunas variables: un "nombre" (en realidad solo un char) y dos punteros de nodo secundarios llamados "left" y "right".

Estaba empezando a escribir un código que tenía que pasar al nodo más a la izquierda, y quedé muy satisfecho cuando se me ocurrió esto:

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

Parece bastante simple: en un bucle infinito, verifique si la corriente tiene un hijo izquierdo, de ser así, establezca el actual para ese niño izquierdo, si no, salga del ciclo. Es un pequeño y divertido trampolín, no demasiado ilegible. (¡Y lo comenté!)

Bueno, a mi compilador no le gusta:

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

Además, el hecho de arrojar algunas llaves en el ciclo while y mover al operador ternario a su propia línea no ayudó (como era de esperar). Tuve que convertirlo en un if / else para que el compilador lo aceptara.

¿Alguien puede explicar cómo está interpretando el juego de una sola línea y por qué se opone?


El operador condicional ternario es un operador que combina expresiones múltiples en una expresión más grande. break es una declaración y no una expresión , por lo que no se puede usar dentro de una expresión condicional ternaria.

Podrías, sin embargo, reescribir tu código así:

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

¡Espero que esto ayude!


¿Por qué no puedo usar una declaración de "interrupción" dentro de una declaración condicional ternaria en C ++?

Debido a que el operador ternario no es una declaración en absoluto, es un operador, y está compuesto de expresiones, no de declaraciones. break es (solo) una declaración, no una expresión.