Kas on vahet (;;) ja (1) kasutamise vahel?


Vastus 1:

Genereeritud koodi osas peaks iga kaasaegne C-kompilaator andma teile samad tulemused.

Autorid, professor ja teised, kes ütlevad, et (;;) tekitab rohkem üldkulusid, kas (a) ei tea, millest nad räägivad, või (b) töötavad iidsete või katkiste kompilaatoritega. jaoks (;;) ei genereerita lisakulusid, kuna silmuse muutuja tingimusi ja sammu ei ole. Kui midagi, võib (1) iidses mitteoptimeerivas kompilatsioonis tekitada rohkem üldkulusid, kuna see kontrollib iga korduse korral, kas 1 on nullist erinev. Kaasaegsed koostajad ei tee seda.

Mõnedes kompilaatorite rakendustes, kui väntstate hoiatustaset piisavalt kõrgele või kasutate ebemelaadset utiliiti, võite aja jooksul saada hoiatuse (1) või selle ekvivalenti, mis ütleb, et tingimusliku avalduse sarnane on püsiv. for (;;) ei anna sellist hoiatust, kuna tingimisi väljendit pole üldse olemas. Olen töötanud projektide kallal, kus tahtsime koostada nullhoiatusi, ja otsustasime seega kasutada mõne aja (1) asemel (;;). Ka (;;) jaoks võib olla lihtsam otsida kui samasuguseid variante.

Muide, kui kavatsete mõnda aega kasutada, peetakse loetavamaks öelda:

kuigi (tõsi)

kui öelda:

samas (1)

kuigi endine nõuab suuremat trükkimist.

Kaasaegses C-s (st alates C99-st 1999. aastal) ei tohiks te luua oma tõelise versiooni. Selle asemel lisage päisefail stdbool.h ja teil on juurdepääs määratletud booli andmetüübile (selle asemel, et kasutada märksõna _Bool) ja sümbolitele true ja false. Enda õigete / valede väärtuste rullimine on nii…

… 1998.


Vastus 2:

Standard: Standard C ++

6.5.3 Väljavõtte1 avaldus (for-init-lause conditionopt; expressionopt) avalduse jaoks on samaväärne koodiga [algandme-lause jaoks (tingimus) {lause avaldisega; }} [/ kood], välja arvatud juhul, kui algandme avalduses deklareeritud nimed asuvad samas deklaratiivses piirkonnas kui tingimustes deklareeritud, ja välja arvatud juhul, kui jätkamine avalduses (mis pole lisatud teise iteratsiooni väljavõttesse) käivitab avalduse enne uuesti - seisundi hindamine. [Märkus: seega täpsustatakse esimeses avalduses ahela initsialiseerimine; tingimus (6.4) täpsustab testi, mis tehakse enne iga iteratsiooni nii, et tingimusest valeks saab silmus; avaldis täpsustab sageli iga iga iteratsiooni järel tehtavat juurdekasvu.— lõppmärkus] 2 Tingimuse või avalduse võib kumbagi või mõlemaid jätta. Puuduv tingimus muudab implikatiivse klausli samaväärseks kui (tõene).

Võib olla


Vastus 3:

Iga oma soola väärt kompilaator genereerib mõlemal juhul identse koodi.

Üks võimalik variant (;;) jaoks on see, et mõned (paljud?) Inimesed peavad numbriliste konstandite kasutamist koodis „kehvaks stiiliks”. See tähendab, et sa ei kirjuta

x + = 10;

aga sa kirjutad

staatiline const int my_constant_value = 10;

(...)

x + = minu_konstant_väärtus;

Põhjus on see, et kui kõik numbrilised konstandid on selgesõnaliselt deklareeritud (ja eelistatavalt lähtefaili alguses, mitte kogu failis levinud), saadakse hooldatavam kood.

Selgelt pole vahet (;;) vs (1) osas, kuid numbrivabas koodis numbri 1 nägemine on endiselt ebamugav.

C ++ -s (ja alates C99-st ka C-s) võime kirjutada "while (true)", kuid see on isegi pikem kui "while (1)", mis ise on pikem (ühe märgi võrra) kui "for (;;) ".