Hi ha alguna diferència entre usar (;;) i while (1)?


Resposta 1:

Pel que fa al codi generat, qualsevol compilador C modern us ha de donar els mateixos resultats.

Els autors, professors i altres que diuen que per (;;) genera més despeses (a) no saben de què parlen o (b) treballen amb compiladors antics o trencats. per (;;) no genera cap sobrecàrrega addicional, perquè no hi ha cap condició ni cap pas d'una variable de llaç. Si hi ha res, mentre que (1) en un antic compilador no optimitzador podria produir més despeses generals, ja que comprova sense problemes si 1 és diferent de zero a la part superior de cada iteració. Els compiladors moderns no ho faran.

En algunes implementacions del compilador, si puges els nivells d’avís prou alts o si utilitzes una utilitat similar a la pel·lícula, potser obtindràs un avís al mateix temps (1) o el seu equivalent, que diu que alguna cosa com l’expressió condicional és constant. per (;;) no genera cap advertiment, perquè no hi ha cap expressió condicional en absolut. He treballat en projectes on volíem compilar amb zero avisos i, per tant, he optat per utilitzar (;;) en lloc d’un (1) equivalent. A més, per (;;) pot ser més fàcil de cercar que les variants alhora.

Per cert, si ho utilitzeu mentre es considera més fàcil llegir:

mentre (cert)

que no pas dir:

mentre (1)

tot i que el primer requereix més mecanografia.

Al modern C (és a dir, des del C99 del 1999), no haureu de crear la vostra pròpia versió de TRUE. En comptes d'això, inclou el fitxer de capçalera stdbool.h i tindràs accés al tipus de dades de bool definit (en lloc d'haver d'utilitzar la paraula clau _Bool) i als símbols true and false. Posar en contacte els vostres propis valors vertaders / falsos és així ...

... 1998.


Resposta 2:

Estàndard: Estàndard C ++

6.5.3 La instrucció for1 La sentència for (for-init-statement conditionopt; expressionopt) és una equivalència a [code] {instrucció for-init-while while (condició) {expression expression; }} [/ codi] excepte que els noms declarats en la instrucció for-init es troben a la mateixa regió declarativa que els declarats a la condició, i excepte que una declaració continuar (no inclosa en una altra declaració d'iteració) executarà l'expressió abans de tornar-la a presentar. -estat d’avaluació. [Nota: Així, la primera instrucció especifica la inicialització del bucle; la condició (6.4) especifica un test, que es va fer abans de cada iteració, de manera que el bucle es desprèn quan la condició es converteix en falsa; l'expressió sovint especifica l'increment que es fa després de cada iteració. - nota final] 2 Una de les dues condicions o de l'expressió es poden ometre. Una condició que falta fa que la clàusula implicada sigui equivalent a while (true).

Pot ser


Resposta 3:

Qualsevol compilador que valgui la sal generaria codi idèntic en ambdós casos.

Una possible preferència per a l’opció for (;;) és que algunes (moltes?) Persones consideren que és “pobre estil” utilitzar constants numèriques al codi. És a dir, no escrius

x + = 10;

però tu escrius

static static int my_constant_value = 10;

(...)

x + = my_constant_value;

El motiu és que tenir totes les constants numèriques declarades explícitament (i preferiblement al començament del fitxer font, en lloc de distribuir-se per tot el fitxer) dóna lloc a un codi més sostenible.

Evidentment, no fa cap diferència respecte a (;;) vs while (1), però veure un '1' en un codi lliure numèric encara és incòmode.

A C ++ (i, des de C99, també a C) podem escriure "while (true)", però és fins i tot més llarg que "while (1)", que per si mateix és més llarg (per 1 caràcter) que "for (;;) ".