Actualmente estoy tratando de recorrer una colección recuperada por una API en C.
La API ofrece una función getNext() que devuelve una referencia al siguiente elemento de la colección, o NULL si se ha llegado al final.
Ahora quería declarar una variable en una expresión while y hacer un bucle hasta NULL:
// create collection from API Collection collection = create(); if (collection == NULL) { return -1 } while (const Element *e = getNext(collection) != NULL) { // print data from e }Al compilar, aparece 'error: expresión inesperada'. ¿Por qué esa declaración no funciona en C? ¿Cómo puedo recorrer la colección cuando todo lo que tengo es una función getNext() que devuelve un elemento o NULL?
También probé lo siguiente, pero ocurrió el mismo error:
while ((const Element *e = getNext(collection)) != NULL) { // print data from e }No es posible porque while() espera una expresión y no es posible colocar una declaración en la expresión (¡aunque es posible introducir un nuevo tipo con expresión!).
Lo mejor que puedes conseguir es:
const Element *e; while ((e = getNext(collection)) != NULL) { // print data from e } Sin embargo, es posible lograr la funcionalidad deseada con un bucle for .
for (const Element *e; (e = getNext(collection)) != NULL; ) { // print data from e }En primer lugar, a diferencia de una declaración for , no puede declarar una nueva variable en una declaración while . Por lo tanto, la siguiente línea es incorrecta:
while (const Element *e = getNext(collection) != NULL) {Podrías arreglar esto escribiendo lo siguiente:
const Element *e; while ( e = getNext(collection) != NULL ) {Una forma más compacta de escribir esto es la siguiente:
for ( const Element *e; e = getNext(collection) != NULL ; ) { La segunda versión tiene la ventaja de que el alcance de la variable e está limitado al bucle for .
Sin embargo, las líneas mencionadas anteriormente también son incorrectas, por la siguiente razón:
El operador != tiene mayor precedencia que = . Entonces la línea
while ( e = getNext(collection) != NULL) {es equivalente a:
while ( e = ( getNext(collection) != NULL ) ) {Esto no es lo que quieres. Deberías escribir lo siguiente en su lugar:
while ( ( e = getNext(collection) ) != NULL ) {En C, no puede declarar una variable en la expresión de condición de un ciclo while.
GCC le dirá:
Error: Expected expression before 'const'