Question

int main()
{
  int var = 0;; // Typo which compiles just fine
}
Était-ce utile?

La solution

C’est ainsi que C et C ++ expriment NOP .

Autres conseils

Sinon, comment assert(foo == bar); pourrait-il ne compiler que lorsque NDEBUG est défini?

Il est évident que nous pouvons dire des choses comme

for(;;) {
  // stuff
}

Qui pourrait vivre sans cela?

Je ne suis pas un concepteur de langage, mais la réponse que je donnerais est & "pourquoi pas? &"; Du point de vue de la conception linguistique, on souhaite que les règles (la grammaire) soient aussi simples que possible.

Sans oublier que " expressions vides " avoir des utilisations, c'est-à-dire.

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

Est-ce que dead-wait (pas un bon usage, mais un usage quand même).

EDIT: Comme indiqué dans un commentaire à cette réponse, tout compilateur digne de ce nom serait probablement pas occupé à attendre cette boucle et à l’optimiser. Cependant, s'il y avait quelque chose de plus utile dans la tête même (autre que i ++), ce que j'ai vu faire (étrangement) avec la traversée de structure de données, alors j'imagine que vous pouvez toujours construire une boucle avec un corps vide (en utilisant / abuser de & "; pour &"; construire).

Honnêtement, je ne sais pas si c'est la vraie raison, mais je pense que quelque chose de plus logique est de penser à cela du point de vue d'un implémenteur de compilateur.

De grandes parties des compilateurs sont construites par des outils automatisés qui analysent des classes spéciales de grammaires. Il semble très naturel que des grammaires utiles permettent des déclarations vides. Il semble inutile de détecter une telle & Quot; erreur & Quot; quand cela ne change pas la sémantique de votre code. L'instruction vide ne fera rien, car le compilateur ne générera pas de code pour ces instructions.

Il me semble que cela résulte simplement de & "Ne corrigez pas un problème qui ne soit pas endommagé &"; ...

Vous voulez pouvoir faire des choses comme

while ( fnorble(the_smurf) == FAILED )
    ;

et non

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

Mais! S'il vous plaît, n'écrivez pas la déclaration vide sur la même ligne, comme ceci:

while ( fnorble(the_smurf) == FAILED );

C'est un très bon moyen de semer la confusion dans l'esprit du lecteur, car il est facile de rater le point-virgule et donc de penser que la rangée suivante est le corps de la boucle. Rappelez-vous: la programmation est vraiment une question de communication - pas avec le compilateur, mais avec d'autres personnes, qui liront votre code. (Ou avec vous-même, trois ans plus tard!)

OK, je vais ajouter ceci au pire des scénarios que vous pourriez réellement utiliser:

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:;
    }
}   

Le cas le plus fréquent est probablement

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

Lorsque vous utilisez ';' s'il vous plaît aussi être conscient de quelque chose. C'est bon:

a ? b() : c();

Cependant, cela ne compilera pas:

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

Il y a des moments où vous voulez vous asseoir et ne rien faire. Une application intégrée pilotée par un événement / une interruption ou lorsque vous ne souhaitez pas qu'une fonction soit fermée, par exemple lors de la configuration de threads et de l'attente du premier changement de contexte.

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

Il y a déjà beaucoup de bonnes réponses mais je n'ai pas vu l'échantillon environnement productif.

Voici est l'implémentation de FreeBSD de strlen:

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

    for (s = str; *s; ++s)
        ;
    return (s - str);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top