Primjer jednostavnog C programa. Primjer jednostavnog programa u C jeziku Primjeri programa u C jeziku s objašnjenjem

Od prevoditelja. Na Internetu sam tražio jednostavne i lako primjenjive smjernice za pisanje programa u C++. Svidjela mi se jedna od opcija i odlučio sam je prevesti i objaviti. Ako je ova tema dobro prihvaćena među korisnicima Habre, mogu prevesti i druge povezane dokumente, kao i smjernice za pisanje koda drugih tvrtki.

1. Uvod

Ovaj dokument sadrži smjernice za pisanje programa u C++.

Ali postoji nekoliko razloga za pojavu još jedne liste preporuka, pored ovih izvora. Glavni razlog je njihova pretjerana općenitost, budući da je često potrebno specificirati privatna pravila (osobito pravila imenovanja). Ovaj dokument sadrži komentare, što ga čini praktičnijim za korištenje pri provođenju revizija koda od drugih postojećih dokumenata. Osim toga, preporuke za programiranje obično sadrže opise stilskih problema i tehničkih problema, što nije baš zgodno. Ovaj dokument ne sadrži nikakve tehničke savjete za C++, fokusirajući se na pitanja stila.

Dostupna razvojna okruženja mogu poboljšati čitljivost koda prikazivanjem modifikatora pristupa, označavanjem koda, automatskim oblikovanjem i više, ali programer se ne bi trebao oslanjati na te alate. Izvorni kod treba uzeti u obzir izvan razvojnog okruženja koje se koristi i treba ga pisati kako bi se povećala čitljivost bez obzira na okruženje.

1.1 Format dokumenta
Preporuke su grupirane po temama i numerirane tako da se na njih može pozivati ​​tijekom pregleda koda. Preporuke su podijeljene prema važnosti: obvezne, vrlo preporučljive i općenite. 1. Dopušteno je svako kršenje preporuka ako poboljšava čitljivost.

2. Pravila se mogu prekršiti ako postoje osobni prigovori na njih.

Ovo je pokušaj stvaranja skupa općih smjernica bez nametanja svima ujednačenog stila. Iskusni programeri ionako obično prilagode stil sebi. Imati pri ruci popis ovakvih smjernica (ili barem zahtijevati da ga pogledaju) natjera ljude da razmisle o svom stilu programiranja i procijene vlastitu praksu programiranja.

S druge strane, novi i neiskusni programeri obično koriste stilske smjernice kako bi bolje razumjeli programski žargon.

3 Konvencije imenovanja

3.1 Opći ugovori o imenovanju
3. Imena koja predstavljaju tipove moraju biti napisana mješovitim slovima, počevši s velikim slovima.

Linija, Štedni račun

4. Imena varijabli moraju se pisati mješovitim slovima, počevši s malim slovima.

Linija, štedni račun
Uobičajena praksa u C++ zajednici programera. Omogućuje jednostavno razlikovanje varijabli od tipova, sprječava potencijalne kolizije imena, na primjer: linija linija;

5. Imenovane konstante (uključujući vrijednosti nabrajanja) moraju biti napisane velikim slovima s podvlakama kao graničnicima.

MAX_ITERATIONS, COLOR_RED, PI
Uobičajena praksa u C++ zajednici programera. Korištenje takvih konstanti treba svesti na minimum. U većini slučajeva implementacija vrijednosti kao metode najbolje je rješenje:

Int getMaxIterations() // NIJE: MAX_ITERATIONS = 25 ( return 25; )
Ovaj je obrazac čitljiviji i jamči jedno sučelje za vrijednosti pohranjene u klasi.

6. Nazivi metoda i funkcija moraju biti glagolski, pisani u mješovitom padežu i počinjati malim slovom.

GetName(), computeTotalWidth()
Isto kao pravilo za varijable, ali razlika između njih leži u njihovim specifičnim oblicima.

7. Imena imenskih prostora treba pisati malim slovima.

Model::analizator, io::iomanager, common::math::geometry
Uobičajena praksa u C++ zajednici programera.

8. Imena tipova u predlošcima trebaju biti imenovana jednim velikim slovom.

Predložak ...predložak ...
Uobičajena praksa u C++ zajednici programera. Omogućuje razlikovanje imena predložaka od drugih korištenih imena.

9. Kratice i kratice u nazivima moraju se pisati malim slovom.
exportHtmlSource(); // NEMOJTE: exportHTMLSource(); openDvdPlayer(); // NE: openDVDPlayer();
Korištenje velikih slova može dovesti do gore opisanog sukoba naziva. Inače bi se varijable zvale dVD, hTML itd., što nije čitljivo. Drugi problem je već opisan gore; kada je ime povezano s drugim, čitljivost se smanjuje; riječ iza kratice ne ističe se onoliko koliko bi trebala.

10. Globalne varijable treba uvijek koristiti s operatorom rezolucije opsega (::).

::mainWindow.open(), ::applicationContext.getName()
Korištenje globalnih varijabli treba izbjegavati. Poželjno je koristiti singletons.

11. Članovi klase s modifikatorom privatna treba dodijeliti sufiks za podvlaku.

Klasa SomeClass (privatno: int length_;)
Osim imena i tipa, opseg je najvažnije svojstvo varijable. Eksplicitno navođenje modifikatora pristupa u obliku podvlake uklanja zabunu između članova klase i lokalnih varijabli. Ovo je važno jer su varijable klase važnije od varijabli metode i s njima treba postupati s više pažnje.

Dodatni učinak sufiksa podvlake je rješavanje problema s imenovanjem u metodama i konstruktorima za postavljanje vrijednosti:

Void setDepth (int dubina) ( dubina_ = dubina; )
Problem je što postoje dvije opcije za podvlaku - kao sufiks i kao prefiks. Obje su mogućnosti u širokoj upotrebi, ali prva se opcija preporučuje jer omogućuje bolju čitljivost. Treba napomenuti da je određivanje modifikatora pristupa za varijable ponekad kontroverzno pitanje. Iako se čini da preporučena praksa stječe pristaše i postaje sve češća među profesionalcima.

12. Prilagođenim varijablama treba dati isti naziv kao i njihov tip.

Void setTopic(Topic* topic) // NIJE: void setTopic(Topic* value) // NOT: void setTopic(Topic* aTopic) // NOT: void setTopic(Topic* t) void connect(Database* database) // NOT : void povezivanje (Baza podataka* db) // NE: void povezivanje (Baza podataka* oracleDB)
Smanjite složenost smanjenjem broja korištenih pojmova i naziva. Također olakšava prepoznavanje tipa jednostavno prema nazivu varijable.

Varijable koje se ne mogu podešavati mogu se imenovati prema njihovoj namjeni i vrsti:

Točka početna točka, središnja točka; Ime loginName;

13. Sva imena trebaju biti napisana na engleskom jeziku.

14. Varijable s velikim opsegom nazivajte dugim imenima, a one s malim opsegom kratkim nazivima.

Nazivi privremenih varijabli koji se koriste za pohranu privremenih vrijednosti ili indeksa najbolje su kratki. Programer koji čita takve varijable trebao bi moći pretpostaviti da se njihove vrijednosti ne koriste dalje od nekoliko redaka koda. Obično su to varijable ja, j, k, l, m, n(za cijele brojeve), i također c I d(za simbole).

15. Imena objekata nisu eksplicitno navedena;

(Nedostaje klauzula br. 16. - napomena prevoditelja.)

3.2 Posebna pravila imenovanja
17. Riječi pripremi se mora se koristiti gdje god se atributu izravno pristupa.

Employee.getName(); zaposlenik.setName(ime); matrix.getElement(2, 4); matrix.setElement(2, 4, vrijednost);
Uobičajena praksa u C++ zajednici programera. U Javi je ova konvencija postala više-manje standardna.

18. Riječ izračunati može se koristiti u metodama koje nešto izračunavaju.

ValueSet->computeAverage(); matrix->computeInverse()
Odmah dajte čitatelju do znanja da je to dugotrajna operacija.

19. Riječ pronaći može se koristiti u metodama koje izvode bilo kakvu pretragu.

Vertex.findNearestVertex(); matrix.findMinElement();
Neka čitatelj odmah zna da je ovo jednostavna metoda pretraživanja koja ne zahtijeva mnogo računanja.

20. Riječ inicijalizirati može se koristiti tamo gdje je objekt ili entitet inicijaliziran.

Printer.initializeFontSet();
Treba dati prednost američkoj verziji inicijala z e nego britanski inicijali s e. Treba izbjegavati kraticu init.

21. Varijablama koje predstavljaju GUI treba dati sufiks koji odgovara nazivu tipa komponente.

MainWindow, propertiesDialog, widthScale, loginText, leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle, itd.
Poboljšava čitljivost jer naziv daje korisniku izravnu naznaku o vrsti varijable, a time i resursima objekata.

22. Množine se trebaju koristiti za predstavljanje skupova (zbirki) objekata.

Vektor Bodovi; int vrijednosti;
Poboljšava čitljivost jer naziv daje korisniku izravnu naznaku o vrsti varijable i operacijama koje se mogu primijeniti na te elemente.

23. Prefiks n treba koristiti za predstavljanje broja objekata.

N bodova, n linija
Oznaka je preuzeta iz matematike, gdje je utvrđena konvencija za označavanje broja objekata.

24. Sufiks Ne treba koristiti za označavanje broja entiteta.

Broj stola, broj zaposlenika
Oznaka je preuzeta iz matematike, gdje je utvrđena konvencija za označavanje broja entiteta.

Još jedna dobra alternativa je prefiks ja: iTable, iEmployee. Jasno daje do znanja da je ovo imenovani iterator.

25. Varijable iteratora treba imenovati ja, j, k itd.

Za (int i = 0; i< nTables); i++) { : } for (vector::iterator i = list.begin(); i != list.end(); i++) ( Element element = *i; ... )
Notacija je preuzeta iz matematike, gdje je utvrđena konvencija za označavanje iteratora.

Varijable s imenima j, k itd. Preporuča se koristiti samo u ugniježđenim petljama.

26. Prefiks je treba koristiti samo za Booleove varijable i metode.

IsSet, isVisible, isFinished, isFound, isOpen
Uobičajena praksa u C++ razvojnoj zajednici, ponekad se koristi iu Javi.

Upotrebom ovog prefiksa rješavate se imena poput status ili zastava. jeStatus ili isFlag jednostavno ne odgovaraju, a programer je prisiljen odabrati smislenija imena.

U nekim situacijama prefiks je Bolje ga je zamijeniti drugim: ima, limenka ili trebao bi:

Bool hasLicense(); bool canEvaluate(); bool trebaSortiraj();

27. Za odgovarajuće operacije moraju se koristiti simetrična imena.

Dohvati/postavi, dodaj/ukloni, stvori/uništi, pokreni/zaustavi, ubaci/briši, povećaj/smanji, staro/novo, početak/kraj, prvo/posljednje, gore/dolje, min/max, sljedeći/prethodni, stari/ novo, otvori/zatvori, prikaži/sakrij, obustavi/nastavi, itd.
Smanjite složenost kroz simetriju.

28. Treba izbjegavati kratice u imenima.

Izračunajprosjek(); // NE: compAvg();
Pogledajmo dvije vrste riječi. Prvi su obične riječi navedene u rječnicima koje se ne mogu skraćivati. Nikad ne skraćujte:

Cmd umjesto naredbe cp umjesto copy pt umjesto point comp umjesto compute init umjesto initialize, itd.

Druga vrsta su riječi specifične za pojedino područje, koje su poznate po skraćenici/kratici. Treba ih pisati skraćeno. Nikad ne piši:

HypertextMarkupLanguage umjesto html CentralProcessingUnit umjesto cpu PriceEarningRatio umjesto pe, itd.

29. Dodatno imenovanje pokazivača treba izbjegavati.

Linija* crta; // NE PREPORUČUJE SE: Line* pLine; // NE PREPORUČUJE SE: Line* linePtr;
Mnoge varijable u C/C++ su pokazivači. Samo kada je vrsta C++ objekta posebno važna, naziv bi to trebao odražavati.

30. Booleovim (logičkim) varijablama ne možete dati imena koja sadrže negaciju.

Bool isError; // NEMOGUĆE: isNoError bool isFound; // NIJE: nije pronađeno
Problem nastaje kada se takav naziv koristi zajedno s operatorom logičke negacije, što za sobom povlači dvostruku negaciju. Rezultat ne mora biti negativan !nije pronađeno.

31. Konstante u enumeracijama mogu imati prefiks – zajednički naziv tipa.

Enum Boja ( COLOR_RED, COLOR_GREEN, COLOR_BLUE );
To daje dodatne informacije o tome gdje se deklaracija nalazi, koje su konstante opisane u jednom nabrajanju i koji koncept predstavljaju konstante.

Drugi pristup je pozivanje na konstante prema njihovom općem tipu: Color::RED, Airline::AIR_FRANCE, itd.

Imajte na umu da se naziv enuma obično piše u jednini, na primjer: enum Boja (...). Ime u množini izgleda dobro kada se deklarira, ali ne funkcionira dobro u praktičnoj upotrebi.

32. Klase iznimke trebale bi dobiti sufiks Iznimka .

Klasa AccessException ( : )
Klase iznimke zapravo nisu dio programske arhitekture, a njihovo imenovanje na ovaj način odvaja ih od ostalih klasa.

33. Funkcije (metode koje vraćaju vrijednosti) trebaju biti imenovane ovisno o tome što vraćaju, a procedure trebaju biti imenovane ovisno o tome što izvode (void metode).

Poboljšajte čitljivost. Ovo imenovanje jasno daje do znanja što metoda čini, a što ne, a također oslobađa kod od potencijalnih nuspojava.

4 datoteke

4.1 Izvorne datoteke
34. C++ datotekama zaglavlja treba dati ekstenziju.h (poželjno) ili.hpp . Datoteke izvornog koda mogu imati ekstenzije.c++ (preporučeno).C , .cc ili.cpp .

MyClass.c++, MyClass.h
Ovo su proširenja odobrena prema standardu C++.

35. Klasa bi trebala biti deklarirana u datoteci zaglavlja i definirana (implementirana) u datoteci izvorni kod, imena datoteka su ista kao naziv klase.

MyClass.h, MyClass.c++

Olakšava pronalaženje datoteka povezanih s razredom. Očita iznimka su klase predložaka, koje se moraju deklarirati i definirati u datoteci zaglavlja.

36. Sve definicije moraju biti u datotekama izvornog koda.

Klasa MyClass ( public: int getValue () (return value_;) // NE! ... private: int value_; )
Datoteke zaglavlja deklariraju sučelje, datoteke izvornog koda ga implementiraju. Ako programer treba pronaći implementaciju, mora biti siguran da će je pronaći u datoteci izvornog koda.

37. Sadržaj datoteke ne smije premašiti 80 stupaca.

80 stupaca - široko korištena rezolucija za uređivače, emulatore terminala, pisače i programe za ispravljanje pogrešaka; datoteke se prenose između različitih osoba, stoga se morate pridržavati ovih ograničenja. Odgovarajući prijelomi redaka poboljšavaju čitljivost prilikom suradnje na izvornom kodu.

38. Ne mogu se koristiti posebni znakovi (kao što je TAB) i prijelomi stranica.

Takvi simboli uzrokuju niz problema s uređivačima, emulatorima terminala i programima za ispravljanje pogrešaka koji se koriste u programima za kolaborativni razvoj i međuplatformskim okruženjima.

39. Nepotpunost isprekidanih linija trebala bi biti očita.

Ukupni zbroj = a + b + c + d + e; funkcija (param1, param2, param3); setText("Dugi red podijeljen" "na dva dijela."); za (int br. tablice = 0; br. tablice< nTables; tableNo += tableStep) { ... }
Prijelomi redaka pojavljuju se kada se prekrši gore opisano ograničenje od 80 stupaca. Teško je dati čvrsta i brza pravila za raščlambu, ali gornji primjeri pokazuju opća načela.

Općenito:

  • decimalni prijelom;
  • pauza nakon operatora;
  • niveliranje nova linija s početkom izraza u prethodnom retku.
4.2 Uključivanje datoteka
40. Datoteke zaglavlja moraju sadržavati zaštitu od gniježđenja.

#ifndef COM_COMPANY_MODULE_CLASSNAME_H #define COM_COMPANY_MODULE_CLASSNAME_H: #endif // COM_COMPANY_MODULE_CLASSNAME_H
Dizajn vam omogućuje izbjegavanje pogrešaka pri kompilaciji. Ova konvencija omogućuje vam da vidite položaj datoteke u strukturi projekta i sprječava sukobe imena.

41. Upute za uključivanje trebaju biti sortirane (po mjestu u hijerarhiji sustava, niža razina - viša pozicija) i grupirane. Između grupa ostavite prazan redak.

#uključi #uključi #uključi #uključi #include "com/company/ui/PropertiesDialog.h" #include "com/company/ui/MainWindow.h"
Putovi uključivanja ne moraju biti apsolutni. Umjesto toga treba koristiti direktive kompilatora.

42. Include direktive treba staviti samo na početak datoteke.

Opća praksa. Izbjegnite neželjene nuspojave koje može uzrokovati "skriveno" uključivanje negdje u sredini datoteke izvornog koda.

5 Izrazi

5.1 Vrste
43. Lokalni tipovi koji se koriste u jednoj datoteci moraju biti deklarirani samo u toj datoteci.

Poboljšava skrivanje informacija.

44. Razredni odsjeci javnost , zaštićen I privatna moraju biti razvrstani. Svi odjeljci moraju biti eksplicitno navedeni.

Prvo bi trebao postojati odjeljak javnost, što će one koji se žele upoznati s razredom spasiti od čitanja odjeljaka zaštićeno/privatno.

45. Određivanje tipa mora biti eksplicitno. Nikad se ne oslanjajte na implicitno pretvaranje tipa.

FloatValue = static_cast (intVrijednost); // NE: floatValue = intValue;
Time programer pokazuje da je svjestan razlike u tipovima i da je zabuna namjerna.

5.2 Varijable
46. ​​​​Varijable treba inicijalizirati na mjestu gdje su deklarirane.

Ovo osigurava da su varijable upotrebljive u svakom trenutku. Ali ponekad to nije moguće učiniti:

Int x, y, z; getCenter(&x, &y, &z);
U tim je slučajevima bolje ostaviti varijable neinicijalizirane nego im dodijeliti bilo kakve vrijednosti.

47. Varijable nikada ne bi trebale imati dvostruko značenje.

Poboljšajte čitljivost osiguravajući da su svi predstavljeni koncepti dosljedni. Smanjite mogućnost pogreške zbog nuspojava.

48. Korištenje globalnih varijabli treba izbjegavati.

Nema razloga za korištenje globalnih varijabli u C++ (zapravo postoji. - Napomena prevoditelja). Isto vrijedi i za globalne funkcije i (statičke) varijable čiji je opseg cijela datoteka.

49. Ne biste trebali deklarirati varijable klase kao javnost .

Ove varijable krše načela skrivanja i enkapsulacije informacija. Umjesto toga, koristite varijable s modifikatorom privatna i povezane funkcije pristupa. Izuzetak je klasa bez ponašanja, praktički podatkovna struktura (ekvivalent strukturama C jezika). U ovom slučaju nema smisla skrivati ​​te varijable.

Imajte na umu da su strukture u C++ zadržane samo radi kompatibilnosti sa C-om; njihova uporaba smanjuje čitljivost koda. Koristite klase umjesto struktura.

(Nedostaje klauzula br. 50. - napomena prevoditelja.)

Plutanje* x; // NE PREPORUČUJE SE: float *x; int&y; // NE PREPORUČUJE SE: int
Da je varijabla pokazivač ili referenca odnosi se na njen tip, a ne na njeno ime. C programeri često imaju drugačiji pristup, ali u C++ je bolje držati se ove preporuke.

(Nedostaje klauzula br. 52. - Op. prevoditelja.)

53. Treba izbjegavati implicitnu usporedbu Booleovih (logičkih) varijabli i pokazivača s nulom.

If (nLines != 0) // NE PREPORUČUJE SE: if (nLines) if (vrijednost != 0.0) // NE PREPORUČUJE se: if (vrijednost)
Standard C++ ne jamči da će vrijednosti varijabli int i float jednake nuli biti predstavljene kao binarne 0. Također, s eksplicitnom usporedbom, tip koji se uspoređuje je vidljiv.

Bilo bi logično pretpostaviti da se pokazivači također ne bi trebali implicitno uspoređivati ​​s nulom, na primjer, if (linija == 0) umjesto if (linija). Potonje je vrlo česta praksa u C/C++, pa se također može koristiti.

54. Varijable treba deklarirati u što je moguće manjem opsegu.

To olakšava kontrolu učinka varijable i nuspojava.

5.3 Ciklusi
55. Ne možete uključiti izraze u for() konstrukciju koji nisu povezani s kontrolom petlje.

Zbroj = 0; // NE: za (i = 0, zbroj = 0; i< 100; i++) for (i = 0; i < 100; i++) sum += value[i]; sum += value[i];
Poboljšajte podršku i čitljivost. Držite kontrolu nad ciklusom strogo odvojeno od onoga što sadrži.

56. Varijable koje se odnose na petlju treba inicijalizirati neposredno prije nje.

57. Do-while petlje se mogu izbjeći.

Takve su petlje manje čitljive jer se stanje opisuje nakon tijela. Čitatelj će morati pregledati cijeli ciklus da bi razumio kako funkcionira.

Do-while petlje uopće nisu striktno potrebne. Bilo koja takva petlja može se zamijeniti s while ili for petljom.

Manje korištenih konstrukcija poboljšava čitljivost.

58. Izbjegavajte korištenje pauza I nastaviti u ciklusima.

Takve izraze treba koristiti samo kada poboljšavaju čitljivost.

(Nedostaje klauzula br. 59. - Op. prevoditelja.)

60. Za beskonačne petlje trebali biste koristiti obrazac dok (istina) .

Dok (istina) ( ​​: ) za (;;) ( // NE! : ) dok (1) ( // NE! : )
Testiranje za jednog je nepotrebno i besmisleno. Forma (;;) nije baš čitljiva; također nije očito da je petlja beskonačna.

5.4 Uvjetni izrazi
61. Strogo izbjegavajte složene krilatice. Umjesto toga unesite Booleove varijable.

Bool je završen = (element br< 0) || (elementNo >maxElement); bool isRepeatedEntry = elementNo == lastElement; if (isFinished || isRepeatedEntry) ( : ) // NOT: if ((elementNo< 0) || (elementNo >maxElement)|| elementNo == zadnjiElement) ( : )
Postavljanje Booleovih varijabli za izraze uzrokovat će samodokumentiranje programa. Dizajn će biti lakši za čitanje, otklanjanje pogrešaka i održavanje.

62. Očekivani dio treba biti smješten u dijelu ako , iznimka - djelomično drugo .

Bool je u redu = readFile(fileName); if (isOk) ( : ) else ( : )
To pomaže osigurati da iznimke ne ometaju normalno izvršavanje. Važno za čitljivost i izvedbu.

63. Uvjet treba staviti u poseban red.

64. Izvršne izraze u uvjetima i odredbama treba strogo izbjegavati.

File* fileHandle = open(fileName, "w"); if (!fileHandle) ( : ) // NE: if (!(fileHandle = open(fileName, "w"))) ( : )
Izvršni izrazi u uvjetima kompliciraju čitljivost. Ovo posebno vrijedi za početnike u C/C++.

5.5 Razno
65. "Magične" brojeve u kodu treba izbjegavati. Brojeve koji nisu 0 ili 1 treba deklarirati kao imenovane konstante.

Ako sam broj nema očito značenje, čitljivost se poboljšava uvođenjem imenovane konstante. Drugi pristup je stvoriti metodu koja se može koristiti za pristup konstanti.

66. Konstante s pomičnim zarezom treba pisati s decimalnom točkom i najmanje jednom znamenkom iza decimalne točke.

Dupli ukupni = 0,0; // NE PREPORUČUJE SE: double total = 0; dvostruka brzina = 3,0e8; // NE PREPORUČUJE SE: dupla brzina = 3e8; dvostruki zbroj; : zbroj = (a + b) * 10,0;
Ovo naglašava različite pristupe pri radu s cijelim brojevima i brojevima s pomičnim zarezom. S matematičkog gledišta ova su dva modela potpuno različita i nekompatibilna.

I također (kao što je prikazano u posljednjem primjeru iznad) naglasak je stavljen na vrstu varijable (zbroj) na mjestu gdje to nije očito.

67. Konstante s pomičnim zarezom treba uvijek pisati s najmanje jednom znamenkom ispred decimalnog zareza.

C++ sustav brojeva i izraza izveden je iz matematike i trebali biste se držati tradicionalnog zapisa kad god je to moguće. Između ostalog, 0.5 je čitljiviji od .5 (prva opcija se ne može zamijeniti s brojem 5).

68. Funkcije moraju navesti vrstu povratne vrijednosti.

Int getValue() // NE: getValue() ( : )
Osim ako nije eksplicitno navedeno, C++ pretpostavlja da je povratna vrijednost tipa int. Nikada se ne biste trebali oslanjati na ovo jer može zbuniti programere koji s tim nisu upoznati.

69. Ne smije se koristiti ići .

Ovaj operater krši načela strukturirano programiranje. Trebalo bi se koristiti samo u vrlo rijetkim slučajevima (na primjer, za izlaz iz duboko ugniježđene petlje) kada bi druge opcije očito umanjile čitljivost.

70. "0" treba koristiti umjesto "NULL".

NULL je dio standardne biblioteke C i zastario je u C++.

6 Dizajn i komentari

6.1 Dizajn
71. Glavna uvlaka treba biti dva razmaka.

Za (i = 0; i< nElements; i++) a[i] = 0;
Jedno uvlačenje razmaka dovoljno je malo da odražava logičku strukturu koda. Uvlačenje više od 4 razmaka čini duboko ugniježđeni kod nečitljivim i povećava vjerojatnost da će se redovi morati prekinuti. Rasprostranjene su opcije s 2, 3 ili 4 razmaka; i 2 i 4 - šire.

72. Blokovi koda trebaju biti oblikovani kao što je prikazano u primjeru 1 (preporučeno) ili primjeru 2, ali ni u kojem slučaju kao što je prikazano u primjeru 3. Formatiranje funkcija i klasa treba slijediti primjer 2.

Dok (!done) ( doSomething(); done = moreToDo(); )

Dok (!done) ( doSomething(); done = moreToDo(); )

Dok (!done) ( doSomething(); done = moreToDo(); )
Primjer 3 koristi dodatnu podlogu koja sprječava da zaslon bude jasan logička struktura kodirati.

73. Deklaracije klasa

Klasa SomeClass: public BaseClass ( public: ... protected: ... private: ... )
Posebna posljedica gore navedenog pravila.

74. Definicije metoda trebaju biti oblikovane na sljedeći način:

Poništite someMethod() ( ... )

75. Izgradnja ako-drugače treba biti formatiran na sljedeći način:

If (uvjet) ( izjave; ) if (uvjet) ( izjave; ) else ( izjave; ) if (uvjet) ( izjave; ) else if (uvjet) ( izjave; ) else ( izjave; )
Posljedica gore navedenog pravila. Štoviše, pisanje drugo u istom retku kao zatvarajuća vitičasta zagrada prvog bloka nije nedopuštena:

If (uvjet) ( izjave; ) else ( izjave; )
Bolje je svaki if-else dio staviti u zaseban red. To olakšava manipuliranje kodom, kao što je pomicanje bloka drugo.

76. Ciklus za treba biti formatiran na sljedeći način:

Za (inicijalizacija; stanje; ažuriranje) ( izjave; )
Posljedica gore navedenog pravila.

77. Ciklus za s praznim tijelom treba formatirati na sljedeći način:

Za (inicijalizacija; stanje; ažuriranje) ;
Naglašava čitatelju da je tijelo prazno. Ipak, treba izbjegavati cikluse bez tijela.

78. Ciklus dok treba biti formatiran na sljedeći način:

Dok (uvjet) ( izjave; )
Posljedica gore navedenog pravila.

79. Ciklus raditi dok treba biti formatiran na sljedeći način:

Do ( izjave; ) dok (uvjet);
Posljedica gore navedenog pravila.

80. Izgradnja sklopka treba biti formatiran na sljedeći način:

Prebaci (uvjet) ( case ABC: izjave; // Nedostaje "break" case DEF: izjave; break; case XYZ: izjave; break; default: izjave; break; )
Imajte na umu da svaka riječ slučaj ima udubljenje u odnosu na cijelu strukturu, što ga pomaže istaknuti. Obratite pozornost i na prostore prije dvotočka. Ako ključna riječ negdje nedostaje pauza, onda bi komentar trebao poslužiti kao upozorenje na ovo. Programeri često zaboravljaju uključiti ovu riječ, pa slučaj njenog namjernog izostavljanja treba posebno opisati.

81. Izgradnja pokušaj uhvatiti treba biti formatiran na sljedeći način:

Pokušajte ( izjave; ) catch (Iznimka& iznimka) ( izjave; )
Posljedica gore navedenog pravila. Pitanja u vezi sa zatvaranjem vitičastih zagrada u konstrukciji ako-drugače, prijavite se i ovdje.

82. Ako dizajn ako-drugače sadrži samo jedan izraz u tijelu, vitičaste zagrade mogu se izostaviti.

If (uvjet) izjava; dok (uvjet) iskaz; za (inicijalizaciju; uvjet; ažuriranje) statement;
I dalje se preporuča ne izostaviti vitičaste zagrade.

83. Tip povrata funkcije može se nalaziti iznad naziva same funkcije.

Void MyClass::myMethod(void) ( : )
Na ovaj način funkcije su poredane u jednom stupcu.

6.2 Razmaci
84.

Operatori trebaju biti odvojeni razmacima.
- Nakon rezervirano ključne riječi u jeziku C++ trebali biste koristiti razmak.
- Iza zareza treba staviti razmake.
- Dvotočke trebaju biti odvojene razmakom.
- Nakon točke-zareza u petlji za trebaju biti uključeni razmaci.

A = (b + c) * d; // NIJE PREPORUČENO: a=(b+c)*d while (true) // NIJE PREPORUČENO: while(true) ( ​​... doSomething(a, b, c, d); // NIJE PREPORUČENO: doSomething (a,b,c,d); slučaj 100: // NE PREPORUČUJE SE: slučaj 100: za (i = 0; i< 10; i++) { // НЕ РЕКОМЕНДУЕТСЯ: for(i=0;i<10;i++){ ...
Ističe pojedine dijelove izraza. Poboljšava čitljivost. Teško je dati opsežan skup preporuka u vezi s razmakom u C++. Gore navedene preporuke trebale bi pokazati opća načela.

85. Imena metoda mogu biti popraćena razmakom ako slijedi drugo ime.

Učini nešto(trenutna datoteka);
Ističe pojedinačna imena. Poboljšava čitljivost. Ako nema daljnjeg imena, razmak se može izostaviti (doSomething()).

Drugi pristup je navođenje razmaka odmah nakon otvarajuće zagrade. Oni koji ga koriste također obično stavljaju razmak ispred zagrade: doSomething(currentFile);. To omogućuje isticanje pojedinačnih imena; Razmak prije završne zagrade izgleda neprirodno, ali bez njega izraz izgleda asimetrično (doSomething(currentFile);).

86. Logički blokovi u kodu trebaju biti odvojeni praznim redom.

Matrica4x4 matrica = nova Matrica4x4(); double cosAngle = Math.cos(kut); dvostruki sinAngle = Math.sin(kut); matrix.setElement(1, 1, cosAngle); matrix.setElement(1, 2, sinAngle); matrix.setElement(2, 1, -sinAngle); matrix.setElement(2, 2, cosAngle); množenje (matrica);
Poboljšava čitljivost.

To im omogućuje da se bolje istaknu.

88. Varijable u deklaracijama mogu se poravnati.

AsciiFile* datoteka; int nBodovi; float x, y;
Poboljšava čitljivost. Parovi su jasnije vidljivi vrsta - varijabla.

89. Koristite poravnanje gdje god poboljšava čitljivost.

If (a == lowValue) compueSomething(); else if (a == mediumValue) computeSomethingElse(); else if (a == highValue) computeSomethingElseYet(); vrijednost = (potencijal * gustoća ulja) / konstanta1 + (dubina * gustoća vode) / konstanta2 + (zCoordinateValue * gustoća plina) / konstanta3; minPosition = computeDistance(min, x, y, z); prosječnaPozicija = izračunajUdaljenost(prosjek, x, y, z); prekidač (vrijednost) ( case PHASE_OIL: strcpy(faza, "Nafta"); break; case PHASE_WATER: strcpy(faza, "Voda"); break; case PHASE_GAS: strcpy(phase, "Gas"); break; )
Postoji mnogo slučajeva u kojima se kod može dodatno uskladiti, čak i ako krši prethodno utvrđena pravila.

6.3 Komentari
90. Kompleksan kod napisan lukavim potezima ne treba komentirati, već prepisati!

Trebali biste dati što je moguće manje komentara, čineći kod samodokumentirajućim odabirom pravih imena i stvaranjem jasne logičke strukture.

91. Svi komentari trebaju biti napisani na engleskom jeziku.

U međunarodnom okruženju engleski je preferirani jezik.

92. Koristite//za sve komentare, uključujući one u više redaka.
// Komentar koji se proteže // u više redaka.
Ako slijedite ovu preporuku, komentare u više redaka /* */ može se koristiti za otklanjanje pogrešaka i druge svrhe.

Nakon // treba staviti razmak, a sam komentar treba započeti velikim slovom i završiti točkom.

93. Komentari trebaju biti raspoređeni tako da se odnose na ono što opisuju.

94. Komentari o klasama i zaglavljima metoda trebaju slijediti JavaDoc konvencije.

Java programeri imaju napredniji pristup dokumentaciji zahvaljujući standardnom automatiziranom alatu Javadoc, koji je dio razvojnog paketa i omogućuje vam automatsko generiranje HTML dokumentacije iz komentara u vašem kodu.

Slični alati postoje u C++. Slijede iste konvencije sintakse oznaka kao JavaDoc (pogledajte na primjer Doc++ ili Doxygen).

7 Poveznice

  • Kod dovršen, Steve McConnell - Microsoft Press
  • Programiranje u C++, Pravila i preporuke, M Henricson, e. Nyquist, Ellemtel (Švedski telekom):

Dajmo neka objašnjenja. U jeziku C svaki se program sastoji od nekoliko programskih jedinica i svaka od njih je funkcija. Funkcije u C-u slične su funkcijama ili potprogramima u Fortranu ili procedurama u Pascalu. Imena funkcija biraju se proizvoljno (samo latiničnim slovima), ali jedno od njih glavni, ovdje počinje izvođenje programa. Takva glavna funkcija obično poziva druge funkcije koje se nalaze u istoj datoteci kao i glavni program ili su dohvaćene iz biblioteke unaprijed obučenih funkcija glavni nema argumenata, pa njegova lista izgleda ovako: () . Zagrade { } okvir operatora koji implementiraju sam algoritam. Ove su zagrade slične BEGIN - END u Pascalu.
Crta int a,b,c; najavljuje a,b,c varijable cjelobrojnog tipa. Sve varijable koje se koriste u programu moraju biti deklarirane. Slijede operatori dodjele to a značenje 5 , i za b - 7 , S- vrijednost njihovog zbroja. Upišite vrijednosti varijable int su u rasponu [-32768; 32767]. Funkcija printf prikazuje: SUM = 12.

Razmotrimo sada funkciju skenirati dizajniran za formatirani unos podataka. Funkcija skenirati koristi varijabilne adrese, a ne njihove vrijednosti kao stvarne parametre. Da biste to učinili, stavite znak ispred odgovarajućeg parametra & - simbol za uzimanje adrese. Na primjer, &XL znači "varijabilna adresa XL", a ne vrijednost koju varijabla trenutno ima.

Niz formata funkcije skenirati specificira koji se podaci očekuju kao ulazni podaci. Ako funkcija naiđe na znak u nizu formata % nakon čega slijedi znak konverzije, preskakat će znakove dok ne naiđe na znak koji nije prazan.

Prethodni program ima jedan nedostatak: program za izračunavanje zbroja prikladan je samo za jedan poseban slučaj, kada a=5, b=7. Poboljšajmo ga zamjenom odgovarajućih operatora dodjele pozivom funkcije skenirati(primjer 1.2) :

Niz formata specificira funkcije skenirati unesite decimalni broj koji želite smjestiti u varijablu a, zatim, odvojen razmakom, unesite drugi decimalni broj koji se mora dodijeliti varijabli b.Imajte na umu da program počinje retkom commintarium: /* .. */ , kompajler preskače sve znakove između /* i */ i može se koristiti za pojašnjenje.

Oznake: Prvi program u C. Osnove Si Borland. C Code Gear. Si Embarcadero. C MS Visual Studio. C MS Express.

Pisanje našeg prvog C programa

Prvo morate instalirati softver. U principu nije bitno koji softver koristite, kao što nije bitan ni operativni sustav. Ali tijekom tečaja dat ću primjere koristeći MS Visula Studio 2012 Express Edition. Visual Studio 2012 Express Edition je besplatan i dovoljan je za proučavanje cijelog tečaja. Osim toga, kao što je praksa pokazala, puno je stroži u pogledu koda i daje potpuniji opis pogrešaka i upozorenja. Kada učite jezik, možete koristiti Borland (aka CodeGEAR, aka Embarcadero, itd.), Dev Cpp, MinGW ili gcc, ili što god želite.

Primjer za MS Visual Studio

1. Otvorite IDE, idite na File | Napravite projekt...

2. Odaberite aplikaciju konzole i dodijelite joj naziv. U ovom slučaju first_program

4. Označite potvrdni okvir "Isprazni projekt".

5. Nakon čega dobivamo praznu strukturu projekta. Dodajte novi element: desnom tipkom miša kliknite mapu
"Datoteke izvornog koda" | Dodaj | Stvori element...

Dodajte novu cpp datoteku, ali je spremite s ekstenzijom .c

Datoteku sam nazvao main.c. Sve je spremno, možete napisati program. koraka za druge platforme.

Borland

Imam instaliran samo Code Gear C++Builder 2007, ali u ostalim (i prethodnim) izdanjima sve se radi isto.

1. Kreirajmo novi projekt File | Novo | ostalo...

2. Dodajte konzolnu aplikaciju

3. Odaberite jezik C

4. Dobijamo gotov projekt. Morate ga spremiti pod imenom koje želite. Do tada će sam projekt i sve datoteke imati zadana imena. Možete ukloniti ono što je Borland napisao u tekstu programa prema zadanim postavkama.

Primjer za cc/gcc za terminal

Otvorite svoj omiljeni uređivač teksta i tamo kopirajte programski kod.

#uključi int main(int argc, char* argv) ( printf("Zdravo, svijete!"); scanf("1"); return 0; )

Ako ste spremili program u datoteku pod nazivom hello.c, upišite naredbu u terminal

Cc zdravo.c ​​-o zdravo

Gcc zdravo -o zdravo

U ovom slučaju, očito, morate biti u mapi s programom. gcc će stvoriti izvršnu datoteku pod nazivom hello. Pokrenite ga i izaći će Hello, World!

Ponekad može doći do problema s pravima pristupa. Provjerite imate li izvršnu datoteku, inače si dajte dopuštenja za njezino pokretanje.

Chmod 760 pozdrav

Ako imate nekoliko datoteka, morat ćete navesti nazive svih datoteka redom. Na primjer, ako imate još dvije datoteke simple.h i simple.c, tada morate pisati

Cc zdravo.c ​​jednostavno.c -o zdravo

Programski kod

Uobičajeno je da se u prvom programu prikazuje Hello, World! na ekran.

#uključi #uključi int main(int argc, char* argv) ( printf("Zdravo, svijete!"); _getch(); return 0; )

Pokrenite program (Run | Run ili F9 za Borland, Build | Build Solution ili F5 za MS) Program će prikazati Hello, World! i čekat će da pritisnete bilo koju tipku.

Pogledajmo kod pobliže. Prva dva retka

#uključi #uključi

direktive prevoditelju za povezivanje standardnih biblioteka stdio (Standard Input Output) i conio (Console Input Output). Ekstenzija .h označava da su to datoteke zaglavlja. Prevodilac kopira kod biblioteka conio i stdio i omogućuje korištenje funkcija opisanih u tim bibliotekama.

Int main(int argc, char* argv)

Ovo je glavna funkcija. Razlikuje se od ostalih funkcija koje možete definirati po tome što je to ulazna točka - iz nje počinje izvođenje programa.

Glavna funkcija ima dva parametra - broj parametara argc i niz proslijeđenih parametara argv. Ovi argumenti nisu obavezni, pa ih ne morate pisati. Kasnije ćemo govoriti o njihovoj upotrebi.

#uključi #uključi int main() ( printf("Hello, World!"); _getch(); return 0; ) Glavna funkcija mora vratiti cijeli broj. Ako je 0, tada je funkcija radila bez grešaka. U modernom C standardu ne možete vratiti 0 i opisati funkciju kao void main. #uključi #uključi void main() ( printf("Hello, World!"); _getch(); ) Naš program sada izgleda vrlo jednostavno. Linija printf("Zdravo, svijete!"); ispisuje redak Hello, World! na ekranu monitora. _getch() čeka na pritisak tipke.

Učinimo nešto kompliciranije kako bismo naučili kako dodati nove datoteke u program. Sada je važno da naučite kako dodati nove datoteke; ako dio koda ostane nejasan, nema veze.
1. Napravite novu datoteku zaglavlja u mapi "Datoteke zaglavlja", nazovite je simple.h
2. Napravite novu datoteku simple.c u mapi Izvorne datoteke.
3. Dodati jednostavnim.h

#ifndef _SIMPLE_H_ #define _SIMPLE_H_ #include #uključi void doNešto(); #završi ako

Ovdje smo deklarirali novu funkciju doSomething. Nema tijelo, bit će opisano u datoteci simple.c. Ovdje također uključujemo biblioteke stdio i conio
Dodaj jednostavnom .c

#include "simple.h" void doSomething() ( printf("Radi!"); _getch(); )

Uključujemo datoteku zaglavlja u simple.c. Napisana je u dvostrukim navodnicima jer nije standardna knjižnična datoteka. Datoteke standardne biblioteke obično se nalaze u folderu za uključivanje samog IDE-a. Ako tamo smjestimo naše datoteke, one se također mogu deklarirati u uglastim zagradama. Također možete koristiti apsolutne putanje datoteka u dvostrukim navodnicima. Budući da smo već uključili conio i stdio biblioteke u .h datoteku, one su "vidljive" u .c datoteci.
Dalje, u glavnom.c