Pregunta

Me gustaría un bucle que use un UInt16 (ushort) para recorrer todos sus valores. Sin embargo, esto no lo hace:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

El problema es que el ciclo se cerrará cuando i == 0xFFFF y no " haga algo " ;. Si cambio la instrucción 'for' a & Quot; for (ushort i = 0; i & Lt; = UInt16.MaxValue; i ++) & Quot ;, entonces se convierte en un bucle infinito porque nunca obtengo a 0x10000 porque los ushorts solo van a 0xFFFF.

Podría hacer 'i' un int y convertirlo o asignarlo a una variable ushort en el ciclo.

¿Alguna sugerencia?

¿Fue útil?

Solución

Use un do...while bucle

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

Hay una discusión interesante sobre los bucles de prueba en la parte superior frente a la inferior aquí .

Otros consejos

UInt16.MaxValue se evalúa como 0xffff , no 0x10000. Creo que puede hacer esto con un bucle do / while, como una variación de la respuesta de burkhard1979.

ushort i = 0;
do {
   ...
} while (++i != 0);

Simplemente puede reemplazar el for por un ciclo do-while.

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

¿tiene que ser un corto? por qué no solo

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

Suponiendo que su código sufre un error de apagado por uno (el código actual, se detiene justo antes de que se evalúe el valor final. Entonces, lo siguiente podría responderle.

Muy simple, ya que su contador es un entero sin signo de 16 bits, no puede tener valores mayores que 0xffff, ya que ese valor aún es válido, debe tener algún valor que se extienda más allá de eso como la protección. Sin embargo, agregar 1 a 0 en 16 bits simplemente se ajusta a <=>. Como se sugiere, use un bucle do while (que no necesita un valor de protección) o use un valor mayor para contener su contador.

ps. El uso de variables de 16 bits en máquinas modernas es en realidad menos eficiente que el uso de variables de 32 bits, ya que no es necesario generar código de desbordamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top