sirven qué que programar programación programacion por para lenguaje desde descargar definicion comandos cero bloques aprender c scope curly-braces

qué - programacion por bloques definicion



¿Por qué incluir bloques de código C en llaves? (9)

Estoy mirando un código C y he notado que está lleno de llaves que rodean bloques de código sin ningún tipo de estructura de control. Mira a ver:

//do some stuff . . . fprintf(stderr, "%.2f sec/n", (float)(clock() - t) / CLOCKS_PER_SEC); { //a block! why not? char *tmp_argv[3]; tmp_argv[0] = argv[0]; tmp_argv[1] = str; tmp_argv[2] = prefix; t = clock(); fprintf(stderr, "[bwa_index] Convert nucleotide PAC to color PAC... "); bwa_pac2cspac(3, tmp_argv); fprintf(stderr, "%.2f sec/n", (float)(clock() - t) / CLOCKS_PER_SEC); }

¿Por qué insertaría bloques como este en el código? Está lleno de ''em. ¿Hay algún tipo de beneficio de rendimiento? Algo de C místico? ¿¿¿Por qué???

edit: Este código es de BWA , un programa bioinformático que alinea secuencias pequeñas con grandes referencias utilizando la transformación Burrows-Wheeler , en caso de que alguno de ustedes se esté preguntando. Este ejemplo de código no es particularmente relevante para la funcionalidad de la aplicación.


El código heredado necesitaba {} para hacer declaraciones en absoluto

En C89, no podrías simplemente hacer int i; en cualquier sitio; las declaraciones solo eran válidas al comienzo de los bloques.

Asi que:

a = 1; int i; /* error */ i = 2;

... no era válido, pero

a = 1 if (e) { int i;

... estuvo bien, como era un bloque sencillo.

El estilo resultante continuó incluso después de que las declaraciones se convirtieron en elemento (s) de bloque válido (C99), en parte por inercia, en parte por la portabilidad hacia atrás y también porque tiene sentido establecer un alcance para nuevas declaraciones.


¿Eso es todo? Tal vez el programador esté usando tmp_argv en otro lugar del código. No puedo pensar en ninguna otra razón, ya que el tmp_argv entre el { y } está separado de cualquiera fuera de los corchetes.


A veces uso bloques en estos casos: - Para localizar variables - O para facilitar la lectura ...


Está creando un alcance. Los objetos apilados se destruyen cuando salen del alcance. Parece que está haciendo algún tipo de tipeo, lo que significa que cada bloque es algo que querían cronometrar. Sin embargo, no veo ningún objeto de temporizador con alcance, así que, sí, no tiene sentido.


Hmm - Tal vez estoy fuera de la tabla aquí, pero creo que la variable local definir dentro de ese bloque no será válida fuera del bloque


Las variables que declaras dentro del bloque son locales para ese bloque. De esta manera, puede redefinir tmp_argv en algún otro lugar de su código (a continuación) sin entrar en conflicto con este fragmento de código.


Otro caso de uso para esto que descubrí recientemente es cuando tienes semántica de apertura / cierre y quieres marcar claramente el código ''interno'':

f = fopen(''file''); { // do stuff } fclose(f);

Esto funciona bien para recordarle que cierre / libere objetos y hace que el código sea algo más limpio.


Para el alcance de las variables Por ejemplo, la variable tmp_argv solo será válida entre llaves.


Un bloque es un ámbito que determina la duración de las variables, así como su visibilidad para el compilador. Entonces, las variables que se crean dentro de un bloque desaparecen cuando el control sale del bloque.

Puede ser muy útil cuando esas variables son instancias de clases con constructores y destructores.

Sin embargo, en tu ejemplo no hay mucha ventaja.