studio programacion móviles libros gutenberg desarrollo desarrollar curso aprende aplicaciones c while-loop

móviles - manual de programacion android pdf



¿Está utilizando un bloque de tiempo para no hacer nada malo? (12)

Actualmente estoy trabajando en los ejercicios en ''The C Programming Language''. Aquí está una de mis soluciones:

int c; while ((c=getchar()) != EOF) { if (c == '' '') { while ((c = getchar()) == '' '') {} // do nothing? putchar('' ''); } putchar(c); }

Encontré algunas soluciones aquí que son bastante diferentes a las mías y uso una variable extra para realizar un seguimiento de lo que está sucediendo, mientras que solo uso un ciclo while para omitir todos los espacios. Mi solución se siente un poco desordenada, ya que parece un poco hackish tener un ciclo while sin nada entre las llaves. Me preguntaba si hay alguna buena razón para no hacer esto. Gracias por cualquier consejo :-)


Bueno, no realmente, pero depende de tu arquitectura.

if (dosomething()) { ; }

Lo anterior va a estar constantemente presionando y saliendo de tu pila local, que tiene una sobrecarga de memoria. Además, también va a enjuagar las tuberías de sus procesadores con operaciones de noop.


Bueno, si realmente no te gustan las abrazaderas vacías, podrías refactorizar ese bucle interior en

while (c == '' '') {c = getchar();}

Sin embargo, esto cuesta una comparación extra, por lo que un ciclo do while sería mejor.


Creo que es perfectamente aceptable.

Yo lo escribiría:

//skip all spaces while ((c = getchar()) == '' '') {}

para hacer obvio que esta línea de código hace una cosa.

O lo escribiría así:

while ((c = getchar()) == '' '') { //no processing required for spaces }

para que coincida con el resto del formato de su código.

Personalmente, no soy un fanático de

while ((c = getchar()) == '' '');

formato. Creo que es fácil pasar por alto el punto y coma.


Creo que no hay problema en eso. Puedes usarlo, en muchas situaciones lo prefiero.


He usado código como este. No creo que haya realmente ninguna razón para no usarlo si la situación lo justifica.


La forma canónica, utilizada desde tiempos inmemoriales, echa un vistazo, por ejemplo, en el libro de Lyons, es

while(condition) // Here''s the whole thing ; // empty body.

De hecho, en general, la convención ''semicolora en una línea separada'' se usa para una declaración nula. Por ejemplo, verá ocasionalmente

if( condition-1) ; else if (condition-2) stmt; else { // do stuff here }

Es mucho más infrecuente, pero aparece donde la condición-1 es muy complicada, por lo que no se quiere negar y la confusión, o donde el código se ha optimizado a mano dentro de una pulgada de su vida, para que quiere el caso más común primero.

los

while(condition) ;

La forma es servidumbre servil, porque es un error común y molesto: debes dejar en claro que lo hiciste a propósito. Llaves vacías

while(condition){ }

o sus variantes, también son un problema porque o no se destacan lo suficiente, o peor conducen a otros errores tipográficos.


No creo que sea el procedimiento, pero su formateo es bastante extraño. No hay nada malo con:

/* Eat spaces */ while ((c = getchar()) == '' '');

(es decir, indicar que intencionalmente no hay un cuerpo)


No, en absoluto, creo que encontrarás bucles de "no hacer nada" como estos en K & R, así que eso es lo más oficial posible.

Es una cuestión de preferencia personal, pero prefiero mis ciclos de "no hacer nada" como este:

while(something());

Otros prefieren que el punto y coma vaya en una línea separada, para reforzar el hecho de que es un ciclo:

while(something()) ;

Otros prefieren usar los corchetes sin nada adentro, como lo has hecho:

while(something()) { }

Todo es válido; solo tendrá que elegir el estilo que desee y atenerse a él.


Tu pregunta "¿Usar un bloque de tiempo para no hacer nada es malo?" también se puede responder en términos de perder ciclos de CPU. En este caso, la respuesta es "No", ya que el proceso se suspenderá mientras espera que el usuario ingrese un carácter.

El proceso se reactivará solo después de la entrada de un personaje. Luego se realizará la prueba y, si la prueba pasa, es decir, c == '''', el proceso volverá a dormirse hasta que se ingrese el siguiente carácter. Esto se repite hasta que se ingrese un carácter no espacial.


Un while que no hace nada probablemente sea algo malo:

while(!ready) { /* Wait for some other thread to set ready */ }

... es una manera realmente, realmente, costosa de esperar; usará tanto CPU como el sistema operativo le dará, mientras ready es falso, robando tiempo de CPU con el que el otro hilo podría estar haciendo un trabajo útil .

Sin embargo, su bucle no está haciendo nada:

while ((c = getchar()) == '' '') {}; // skip

... porque llama a getchar() en cada iteración. Por lo tanto, como todos los demás han estado de acuerdo, lo que has hecho está bien.


Una opción alternativa que aún no se ha mencionado:

while(condition) (void)0;

Realmente no prefiero escribir mis loops de esta manera , pero tuve un TA el último semestre que lo hizo.


Yo preferiría:

while ((c = getchar()) == '' '') /* Eat spaces */;

También se me conoce por tener un procedimiento llamado DoNothing específicamente para llamar en casos como este. Deja muy en claro que realmente no quieres hacer nada.

Si bien los cuerpos de bucle inexistentes son perfectamente aceptables, debe estar MUY claro que es intencional.