Pregunta

int main()
{
  int var = 0;; // Typo which compiles just fine
}
¿Fue útil?

Solución

Esta es la forma en que C y C ++ expresan NOP .

Otros consejos

¿De qué otra manera podría assert(foo == bar); compilarse a nada cuando se define NDEBUG?

Obviamente es para que podamos decir cosas como

for(;;) {
  // stuff
}

¿Quién podría vivir sin eso?

No soy diseñador de idiomas, pero la respuesta que daría es " ¿por qué no? " Desde la perspectiva del diseño del lenguaje, uno quiere que las reglas (es decir, la gramática) sean lo más simples posible.

Sin mencionar que " expresiones vacías " tiene usos, es decir,

para (i = 0; i < INSANE_NUMBER; i ++);

Esperará (no es un buen uso, pero no obstante).

EDITAR: Como se señaló en un comentario a esta respuesta, cualquier compilador que valga la pena probablemente no esté ocupado esperando en este bucle y optimizándolo. Sin embargo, si hubiera algo más útil en la cabeza for (aparte de i ++), que he visto hacer (extrañamente) con el recorrido de la estructura de datos, entonces imagino que aún podría construir un bucle con un cuerpo vacío (usando / abusar de " para " construcción).

Sinceramente, no sé si esta es la verdadera razón, pero creo que algo que tiene más sentido es pensarlo desde el punto de vista de un implementador del compilador.

Grandes porciones de compiladores están construidos por herramientas automatizadas que analizan clases especiales de gramáticas. Parece muy natural que las gramáticas útiles permitan declaraciones vacías. Parece un trabajo innecesario detectar un & Quot; error & Quot; cuando no cambia la semántica de su código. La declaración vacía no hará nada, ya que el compilador no generará código para esas declaraciones.

Me parece que esto es solo el resultado de " No arregles algo que no está roto " ...

Desea poder hacer cosas como

while ( fnorble(the_smurf) == FAILED )
    ;

y no

while ( fnorble(the_smurf) == FAILED )
    do_nothing_just_because_you_have_to_write_something_here();

¡Pero! Por favor, no escriba la declaración vacía en la misma línea, así:

while ( fnorble(the_smurf) == FAILED );

Esa es una muy buena manera de confundir al lector, ya que es fácil pasar por alto el punto y coma y, por lo tanto, pensar que la siguiente fila es el cuerpo del bucle. Recuerde: la programación se trata realmente de comunicación, no con el compilador, sino con otras personas, que leerán su código. (¡O contigo mismo, tres años después!)

OK, agregaré esto al peor de los casos que realmente puede usar:

for (int yy = 0; yy < nHeight; ++yy)
{
    for (int xx = 0; xx < nWidth; ++xx)
    {
        for (int vv = yy - 3; vv <= yy + 3; ++vv)
        {
            for (int uu = xx - 3; uu <= xx + 3; ++uu)
            {
                if (test(uu, vv))
                {
                    goto Next;
                }
            }
        }

    Next:;
    }
}   

El caso más común es probablemente

int i = 0;
for (/* empty*/; i != 10; ++i) {
    if (x[i].bad) break;
}
if (i != 10) {
    /* panic */
}

Cuando se usa ';' Por favor, también tenga en cuenta una cosa. Esto está bien:

a ? b() : c();

Sin embargo, esto no se compilará:

a ? b() : ; ;
while(1){
    ; /* do nothing */
}

Hay momentos en que quieres sentarte y no hacer nada. Una aplicación integrada impulsada por evento / interrupción o cuando no desea que salga una función, como cuando se configuran subprocesos y se espera el primer cambio de contexto.

ejemplo: http://lxr.linux.no/ Linux + v2.6.29 / arch / m68k / mac / misc.c # L523

Ya hay muchas buenas respuestas, pero no he visto la muestra del entorno productivo.

Aquí está la implementación de FreeBSD de strlen:

size_t
strlen(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
        ;
    return (s - str);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top