¿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.