loop - if c#
Loop de 0x0000 a 0xFFFF (5)
¿Tiene que ser un corto? por qué no solo
for(int i = 0;i<=0xFFFF;i++)
{
//do whatever
}
Me gustaría un bucle que utiliza 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 yo == 0xFFFF y no "haga algo". Si cambio la declaración ''for'' a ''for (ushort i = 0; i <= UInt16.MaxValue; i ++)'', entonces se convierte en un bucle infinito porque nunca llega a 0x10000 porque los ushorts solo van a 0xFFFF.
Podría hacer ''i'' una int y lanzarlo o asignarlo a una variable ushort en el ciclo.
¿Alguna sugerencia?
Simplemente puede reemplazar el for por un ciclo do-while.
ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
Suponiendo que su código sufre un error de apagado por uno (el código actual, se detiene justo antes de evaluar 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 todavía es válido, debe tener algún valor que se extienda más allá de eso como guardia. Sin embargo, al agregar de 1
a 0xffff
en 16 bits, se ajusta a 0
. Como se sugirió, utilice un ciclo do while (que no necesita un valor de protección) o use un valor más grande para contener su contador.
PD. 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 un código de desbordamiento.
UInt16.MaxValue
evalúa a 0xffff
, no a 0x10000
. Creo que puedes hacer esto con un ciclo do
/ while, como una variación de la respuesta de burkhard1979.
ushort i = 0;
do {
...
} while (++i != 0);
Use un do...while
loop
ushort i = 0;
do
{
// do something
} while(i++ < UInt16.MaxValue);
Hay una discusión interesante de los bucles de prueba en la parte superior contra la parte inferior aquí .