Un acertijo (en C)

Un amigo me dio un acertijo:

#include #define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0]))) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) printf("%d\n",array[d+1]); getchar(); return 0; } 

Se supone que el código anterior imprime todos los elementos de la matriz, ¿cuál es el problema en el código (la salida no es nada)? Creo que el ciclo no itera ni siquiera una vez.

Descubrí que el siguiente código funciona:

 #include #define TOTAL_ELEMENTS ((sizeof(array) / sizeof(array[0]))) int array[] = {23,34,12,17,204,99,16}; int main() { int d; int x = (TOTAL_ELEMENTS-2); for(d=-1;d <= x;d++) printf("%d\n",array[d+1]); getchar(); return 0; } 

Tengo la teoría de que tiene algo que ver con la macro, pero no puedo identificar el problema.

El problema es que (TOTAL_ELEMENTS-2) es un valor sin signo. Cuando realiza la comparación d <= (TOTAL_ELEMENTS-2) , ambos valores se convierten en valores sin firmar y el resultado es falso.

En su segundo ejemplo, x está firmado por lo que no hay problema.

El operador sizeof produce un resultado de tipo size_t . En la primera versión, está comparando un int (signed) contra un size_t (unsigned).

En la segunda versión, usted convierte la expresión size_t a un int asignándola, y por lo tanto ambos operandos de la comparación son del mismo tipo.

Otra forma de ver este problema es seguir

 #include int main() { int i = -5; unsigned int j = 6; if(i < j) printf("-5 is less than 6"); else printf("-5 is greater than 6"); return 0; } 

La salida es:

 -5 is greater than 6 

Motivo: la comparación del entero sin signo con el entero con signo siempre devolverá falso.

En el caso del cuestionario, el sizeof devuelve el tipo de datos sin firmar , pero se compara con el tipo de datos firmado (- es un error)

Ejecuto el siguiente progtwig sin usar ninguna macro y la salida no era nada

 #include int main() { int d; for(d=-1;d<=sizeof(int);d++) { printf("sizeof operator\n"); } return 0; } 

Por lo tanto, significa que el problema no está en MACRO sino en el tipo de valor sizeof devuelve. sizeof devuelve el tamaño del tipo de datos como size_t que no está firmado, pero -1 se convierte implícitamente a unsigned, que es 0xffffffff y es obviamente mayor que sizeof (int). Consulte también Ejemplo de código no conforme (comparación)