C programozás
Don't panic! (Zaphod Beeblebrox)
Zidarics Zoltán, 2008
Történelem ●
1970, Dennis Ritchie, Ken Thompson
●
Unix operációs rendszer
●
A nevét egy korábbi „B” nyelv továbbfejlesztett változata miatt kapta.
●
1989 ANSI X3.159–1989 „A C programozási nyelv”
●
1990 ISO/EC 9899:1990.
●
1999 ISO 9899:1999 „C99”
Forrásprogram ●
.c és .h kiterjesztésű ASCII text file
Fordítás ●
forrás(ok) -> fordító -> futtatható bináris
Felépítés ●
Megjegyzések
●
Whitespace
●
Makró direktívák
●
Kulcsszavak
●
Elválasztójelek
●
Azonosító
●
Változó deklarációk
●
Függvények
Megjegyzések ●
egy sorban: //
●
több sorban: /* */
●
fordító figyelmen kívül hagyja
Whitespace ●
space (szóköz),
●
lf (soremelés),
●
new page (lapdobás),
●
tab (tabulátor),
●
vt (vertical tab)
Makró direktívák ●
makró előfeldolgozónak szóló parancsok
●
sor elején # karakterrel kezdődik
●
●
●
●
include
a libc include könyvtárából a file beszerkesztése az aktuális forrásba. include „file” az aktuális forrás könyvtárhoz képest relatív útvonalon található file beszerkesztése az aktuális forrásba. define, undef, feltételes fordítási direktíva létrehozása ill. megszüntetése ifdef, ifndef vizsgálat feltételes fordítási változóra
Kulcsszavak ●
Nyelv definíciójában szereplő foglalt szavak, másra nem használhatók.
●
auto,break,case,char,const,continue,default,do,
●
double,else,enum,extern,float,for,goto,if,
●
int,long,register,return,short,signed,sizeof,
●
static,struct,switch,typedef,union,unsigned,
●
void,volatile,while
Elválasztó jelek ●
●
A szimbólumokat egymástól legalább egy whitespace-szel el kell választani Kivétel, ha a szimbólumok között a szintaktikai szabályok szerint elválasztójel kerül.
●
Az operátorok is elválasztó jelek.
●
[]{}()*,:=;...#
Azonosító ●
változóknak, függvényeknek,felhasználó által definiált típusoknak adott név.
●
Kisbetűvel, nagybetűvel vagy aláhúzás jellel kezdődik,
●
A további karakterek lehetnek számjegyek is,
●
nem lehet kulcsszó, vagy előre definiált védett azonosító.
●
Kis és nagybetű érzékenyek,
●
Kerülni kell a __ (két aláhúzással) kezdődő neveket
●
Az első 31 karaktere szignifikáns
Változók ●
Egész típusok (int)
●
Lebegőpontos típusok (float)
Egész típusok ●
limits.h
●
Signed (alapértelmezett) MSB
●
LSB
27
26
25
24
23
22
21
20
0
1
1
1
1
1
1
1
127
1
1
1
1
1
1
1
1
-127
7
2
6
2
5
2
4
2
3
2
2
2
1
20
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
255
Unsigned MSB 2
LSB
short <= int <= long
byte ●
-127 – 127
●
0 – 255
char ●
-128 – +127 (CHAR_MIN – CHAR_MAX)
●
0 – 255 (UCHAR_MAX)
short ●
Legalább 2 byte
●
-32768 – +32767 (SHRT_MIN – SHRT_MAX)
●
0 – 65535 (USHRT_MAX)
int ●
Legalább 2 byte
●
-32768 – +32767 (INT_MIN – INT_MAX)
●
0 – 65535 (UINT_MAX)
●
Célszerű a platform szószélességére választani (x86: 4 byte)
long ●
Legalább 4 byte
●
-2147483648 – +2147483647 (LONG_MIN – LONG_MAX)
●
0 – 4294967295 (ULONG_MAX)
long long ●
●
●
C99-től -9223372036854775808 – +9223372036854775807 (LLONG_MIN – LLONG_MAX) 0 – 18446744073709551615 (ULLONG_MAX)
Lazítás:Valószínűtlenségi hajtómű ●
●
●
●
Az Útikalauzban leírtak szerint a véges valószín űtlenségek generálásának elve már régesrégen ismert volt – elég, ha egy Szupra-mütyür 57 Szubmezon Agy logikai áramköreit egy atomi vektor-plotterhez kapcsoljuk, miközben a plottert er ős Brown-mozgás generátorba merítjük (a könyv szerint ilyen egy csésze forró, illatos tea). Kutatók hosszú sora próbált olyan szerkezetet építeni, mellyel végtelen valószín űtlenségi mez ő lenne generálható. Sorozatos kudarcok után aztán megállapodtak, hogy az ilyen gép megépítése lényegében lehetetlen. Egy napon aztán egy diák, aki egy különösen rosszul sikerült mulatság után magára maradt a takarítással, azon vette észre magát, hogy így érvel: – Ha egy ilyen szerkezet megépítése lényegében lehetetlen, szükségszer űen véges a lehetetlensége. Ahhoz tehát, hogy megkonstruálhassak egy ilyen gépet, el őször ki kell számolnom, mennyire valószínűtlen a megépítése, majd ezt a számot betáplálnom a véges valószínűtlenségi generátorba, egy csésze forró, g őzölg ő teát töltenem neki… És be is kapcsolhatom. Így is tett, és meglepetéssel konstatálta, hogy sikerült a semmib ől megalkotnia a sokak által régen keresett Végtelen Valószín űtlenség Generátort.
Lebegőpontos típusok ●
●
●
float –
min 6 digit,
–
4byte, mantissza+előjel (3 byte), karakterisztika+előjel (1 byte)
–
±3.4*10-38 – ±3.4*10+38
double –
min 10 digit
–
8byte
long double –
min 10 digit
–
12byte
Változók használata ●
●
●
deklaráció –
típus nev; pl.: int ev;
–
típus nev1,nev2,...nevn; endTime;
pl. long beginTime,
kezdeti értékadás –
int ev=2008;
–
long beginTime=endTime=0;
Konstansok (a program futása során nem változhat) –
const float pi=3.14;
Lazítás:A pángalaktikus gégepukkasztó (PGP) ●
●
●
●
●
●
●
legjobb létező ital a PGP.Hatása olyan, mint amikor szétverik az ember agyát egy lédús citromszelettel, melyet vaskos aranytéglára erősítettek. A GALAXIS Útikalauz arról is tájékoztat, hogy mely bolygókon mixelik a legjobb PGP, várhatólag mennyit kell fizetni érte, és miféle jótékony szervezetek segíthetnek az utólagos rehabilitációban. A GALAXIS Útikalauz azt is elmondja, hogyan mixeljünk magunknak PGP-t: Töltsünk be egy palackkal a jó öreg ó-Janx-szeszből - hangzik a recept. Adjunk hozzá egy rész vizet a Santagrinus-V tengereiből. Ó, az a santagrineánus tengervíz – teszi hozzá a GALAXIS Útikalauz – azok a santagrineánus halak Olvasszunk fel a keverékben három kocka Arcturus Megagint – alaposan meg kell jegelni, különben elvész a benzin Buborékoltassunk át négy liter falliánus mocsárgázt a keveréken, mindazon boldog stopposok emlékére, akik belepusztultak a gyönyörökbe Fallia Mocsaraiban. Gördítsünk egy mérce Qualactin Hiper Menta Extraktumot egy ezüstkanál hátára, hadd hozza magával a sötét Qualactin Zónák nehéz illatát, áthatóan, édesen, misztikusan. Ejtsük bele az algoliai naptigris egy fogát. Figyeljük, mint oldódik fel, és mint juttatja el az Algol Napok tűzét az ital szíve mélyéig.
●
Loccsantsunk rá Zamphourt.
●
Adjunk hozzá egy olajbogyót.
●
Igyuk meg… nagyon-nagyon óvatosan…"
Operátorok ●
aritmetikai operátorok
●
összehasonlító operátorok
●
bitműveletek
●
egyéb operátorok
●
nyelvi kiegészítések
Unáris plusz + ●
+a
Pozitív előjel
+a
Összeadás
a+b
prefix inkrement
++a
postfix inkrement
a++
Értékadás összeadással
a+=b
Negatív előjel
-a
Kivonás
a-b
prefix dekrement
--a
postfix dekrement
a--
Értékadás kivonással
a-=b
Szorzás
a*b
Értékadás szorzással
a*=b
Osztás
a/b
Értékadás osztással
a/=b
Maradék osztás
a%b
Értékadás maradékosztással
a %= b
Összeadás ●
●
a+b pl. int a=1,b=2,c; c=a+b; // c értéke 3
prefix inkrement ●
●
++a pl. int a=1,b; b=++a; // b értéke 2, a értéke 2
postfix inkrement ●
●
a++ pl. int a=1,b; b=a++; // b értéke 1, a értéke 2
Értékadás összeadással ●
●
a+=b pl. int a=1,b=2; b+=a; // b értéke 3
Unáris mínusz ●
-a
Kivonás ●
●
a-b pl. int a=1,b=2,c; c=a-b; // c értéke -1
prefix dekrement ●
●
--a pl. int a=1,b; b=--a; // b értéke 0, a értéke 0
postfix dekrement ●
●
a-pl. int a=1,b; b=a--; // b értéke 1, a értéke 0
Értékadás kivonással ●
●
a-=b pl. int a=1,b=2; b-=a; // b értéke 1
Szorzás ●
●
a*b pl. int a=1,b=2,c; c=a*b; // c értéke 2
Értékadás szorzással ●
●
a*=b pl. int a=1,b=2; b*=a; // b értéke 2
Osztás ●
●
a/b pl. int a=4,b=2,c; c=a/b; // c értéke 2
Értékadás osztással ●
●
a/=b pl. int a=1,b=2; b/=a; // b értéke 2
Maradékosztás ●
●
a%b pl. int a=3,b=2,c; c=a % b; // c értéke 1
Értékadás maradékosztással ●
●
a %= b pl. int a=2,b=3; b %= a; // b értéke 1
Lazítás: A Nagy Zöld Trüsszentő ●
●
●
Kezdetben volt az Univerzum teremtése. Ez sokak rosszallását kiváltotta, s elterjedt vélemény szerint nem tartozott a legjobb húzások közé. Sok faj véli úgy, hogy a teremtésért valamiféle isten volna okolható, ám a Viltvodle VI jatravartidjai arra a nézetre hajlanak, hogy a Mindenség valójában a Nagy Zöld Trüsszentő orrlikából esett ki eredetileg. A jatravartidok, akik örök rettegésben félik le életüket a Nagy fehér papírzsebkendő eljövetelére várva, apró kék teremtmények, fejenként több mint ötven karral, ennélfogva az egyedüli olyan fajt képviselik az Univerzum történetében, amely el őbb találta fel az aeroszolos hónaljgátlót, mint a kereket. Mindazonáltal, az Őstrüsszentés elmélete nem nyert széles kör ű elismerésre a Viltvodle VIon kívül, ezért az Univerzum talányosan képtelen volta folytonos magyarázatkeresésre sarkallja a kutatókat.
Összehasonlító operátorok ●
●
●
●
●
●
> nagyobb mint
Kisebb mint (less than)
a
Kisebb vagy egyenlő (less than or equal)
a<=b
Nagyobb mint (greater than) >= nagyobb, vagy egyenlő
Nagyobb vagy egyenlő (greater than or equal)
<= kisebb, vagy egyenlő Nem egyenlő (not equal)
a>b a>=b a!=b
< kisebb mint
Egyenlő (equal)
a==b
Logikai negált
!a
== egyenlő
Logikai ÉS (and)
a && b
Logikai VAGY (or)
a || b
!= nem egyenlő
> nagyobb mint ●
int a=3; if (a > 2) printf („a nagyobb mint 2”);
>= nagyobb, vagy egyenlő ●
int a=2; if (a >= 2) printf („a nagyobb vagy egyenlő mint 2”);
<= kisebb, vagy egyenlő ●
int a=2; if (a <= 2) printf („a kisebb vagy egyenlő mint 2”);
< kisebb mint ●
int a=1; if (a < 2) printf („a kisebb mint 2”);
== egyenlő ●
int a=3; if (a == 3) printf („a egyenlő 2”);
!= nem egyenlő ●
int a=2; if (a != 3) printf („a nem egyenlő 3”);
bitműveletek ●
●
●
●
ÉS & VAGY |
Bitenkénti balra léptetés
a << b
Értékadás bitenkénti balra léptetéssel
a <<= b
Bitenkénti jobbra léptetés
a>>b
Értékadás bitenkénti jobbra léptetéssel
a >>= b
Bitenkénti komplementálás
~a
KIZÁRÓ VAGY ^ Bitenkénti ÉS kapcsolat NEGÁLÁS ~
a&b
Értékadás bitenkénti ÉS kapcsolattal
a &=b
Bitenkénti OR kapcsolat
a|b
Értékadás bitenkénti VAGY kapcsolattal
a |= b
Bitenkénti kizáró vagy
a^b
Értékadás bitenkénti kizáró vagy kapcsolattal
a ^= b
ÉS & ●
●
int a=0x7f, b=0x30,c,d=0xff; c=a&b; // c=0x30 d &= b; // d = 0x30 (0xff & 0x30) használat: egy változóban a maszk által megadott bitek törlése. pl. int control = 7; int mask = 3; control &= ~mask; // control: 1 (7 & 0xfc )
VAGY | ●
●
int a=0xf, b=0x30,c,d=0; c= a | b; // c=0x3f d |= b; // d = 0x30 (0 | 0x30) használat: egy változóban a maszk által megadott bitek beállítása. pl. int control = 3; int mask = 8; control |=mask; // control = 0xb (3 | 8)
KIZÁRÓ VAGY ^ ●
●
int a=0x55, b=0xff,c,d=0xff; c= a ^ b; // c=0xaa d ^= a; // d = 0xaa (0xff ^ 0x55) használat: egy változóban a maszk által megadott bitek negálása.
● ●
... ... int int control control == 0xf; 0xf; int int mask mask == 1; 1; control control ^= ^= mask; mask; //// control control 0xe 0xe
NEGÁLÁS ~ ●
int a=0xf, b; b = ~a; // b=0xf0
Logikai operátorok ●
ÉS kapcsolat &&
●
VAGY kapcsolat ||
●
LOGIKAI NEGÁLÁS !
ÉS kapcsolat && ●
●
●
Több feltétel egyidejű teljesülése
● ●
Kiértékelés balról jobbra Az első „hamis” feltétel esetén a kiértékelés megszakad
... ...
int inta=1, a=1,b=2; b=2; int intcc==aa!= !=11&& &&bb== ==2; 2;////c: c:00 int intdd==aa== ==11&& &&bb== ==2; 2;////c: c:!0 !0
VAGY kapcsolat || ●
●
●
Legalább egy feltétel teljesülése
● ●
... ... int inta=1; a=1; int intb=2; b=2;
Kiértékelés balról jobbra Az első „igaz” feltétel esetén a kiértékelés megszakad
● ●
int intcc==aa!=1 !=1||||bb== ==2; 2; ////cc!0 !0
LOGIKAI NEGÁLÁS ! ●
●
●
Több feltétel egyidejű teljesülése Kiértékelés balról jobbra Az első „hamis” feltétel esetén a kiértékelés megszakad
● ●
... ... int inta=1, a=1,b=2; b=2; int intcc==!(a !(a== ==11&& &&bb==2); ==2);//c //c00 int //d intdd==!a; !a; //d00
Feltételes értékadás ●
kifejezés ? kifejezés : kifejezés;
● ●
... ... int intaa==3; 3;b=2; b=2; int intcc==aa== ==33??aa::b; b;////c: c:aa
Operátorok precedenciája ●
() [] ! ~ ++ -* / % + << >> < <= > >= == != & ^ | && || ?: = += -= stb. ,
-
(típus) * &
. -> sizeof
Következmények ●
if ((x & MASK) == 0)
●
x = f() + g();
●
++n; printf("%d %d\n",++n, power(2, n));
●
a[i] = i++;
Lazítás:Vogon költészet ●
●
●
„Magától értetődik, hogy a Vogon költészet a harmadik legrosszabb a világegyetemben. A második legrosszabb Kria Azgótjaié. Amikor az Azgót Költ ők Nagymestere, Dagályos Morrogh előadta Óda a Kis Csomó Zöld Dagadékhoz, Melyet A Hónom Alatt Leltem Egy Nyári Reggelen című poémáját, a hallgatóságból négyen a helyszínen kimúltak bels ő vérzés következtében, és a Közép-Galaktikus M űvészet-Manipuláló Tanács elnöke is csak úgy menekült meg, hogy lerágta a saját lábát. Morrogh mint jelentették, »csalódottan értesült« a költemény fogadtatásáról, és Kedvenc Fürdőszobai Gargarizálásaim című, tizenkét kötetes eposzának felolvasására készült, amikor is a saját vastagbele elkeseredett gesztusra szánta el magát az élet és a civilizáció védelmében. Egyenesen keresztül szökkent Morrogh nyakán, és kiszorította agyából a szuszt. A világ legrosszabb költészete megsemmisült alkotójával, a redbridge-i Paul Neil Milne Johnstone-nal együtt amikor a Föld bolygó megsemmisült. A Vogon költészet ezekhez képest enyhe.”
Lazítás:Vogon költészet II. ●
A Vogon költészetet hallgatni megfelel egy inkvizíciós vallatásnak, mint azt Arthur Dent és Ford Prefect tapasztalta, amikor a Vogon kapitány versét kellett meghallgatniuk azel őtt, hogy kidobták őket a zsilipkapun át a világ űrbe. Részlet: „Ó, pirsönő morgolosta Vizelevényeid mint a többözös rejtjeméh hátán a szederjes gennyekély. Huss, fohászom száll feléd kedvelátos zümmögényem! Abroncskodón körbesarj suhogó pettyeleveddel, mert szétmarcangolom takonybibircsókjaidat pacagánycsökömmel, meglásd!” (Prostatikus Vogon Jeltz, Vogon Tisztvisel ő)
Vezérlési szerkezetek ●
utasítások és blokkok
●
if – else utasítás
●
switch utasítás
●
while utasítás
●
for utasítás
●
do utasítás
●
continue utasítás
utasítások és blokkok ●
●
●
●
kifejezések után pontosvessző -> utasítás a pontosvessző utasításlezáró jel (terminátor) és NEM elválasztójel. utasítások összefogása egyetlen összetett utasítássá: {}
if – else utasítás ●
●
●
●
●
if (kifejezés) 1. utasítás else 2. utasítás
● ●
else rész nem kötelező ha a kifejezés igaz (NEM 0), akkor 1. utasítás, ha értéke hamis (0), akkor 2.utasítás a kifejezée numerikus értékét vizsgálja, ezért if (kifejezés) használható az if (kifejezés != 0) helyett. az else a hozzá legközelebb álló else nélküli if-hez tartozik.
● ●
... ... ifif(n>0) (n>0) ifif(a>b) (a>b) z=a; z=a; else else z=b; z=b; ifif(n>0) (n>0) for for(i=0;i>0) 0){{ printf printf(„....”); („....”); return returni;i; }} else else printf(„ROSSZ!!!!!!”); printf(„ROSSZ!!!!!!”);
switch utasítás ●
●
switch (kifejezés) { case érték: utasítás; case érték: utasítás; ... default: utasítás; } minden case ág lefut, ha nincs szükség rá: break
● ●
... ... char charletter=getchar(); letter=getchar(); int intvalue; value; switch switch(letter) (letter){{ case case'0': '0':value value==0; 0; break; break; case case'1': '1':value value==1; 1; break; break; case case'2': '2':value value==2; 2; break; break; ... ... case case'9': '9':value value==9; 9; break; break; default: default:value value==-1; -1; }}
while utasítás ●
while (kifejezés) utasítás
● ●
... ... int inta=0; a=0; while while(a<10) (a<10){{ printf printf("i=%d, ("i=%d,i*i=%d\n",i,i*i); i*i=%d\n",i,i*i); a++; a++; }}
for utasítás ●
●
●
●
for (kif1;kif2;kif3) utasítás kif1 és kif3 általában értékadás, vagy függvényhívás, kif2 relációs kifejezés bármelyik kifejezés elhagyható, de a ;-nek meg kell maradnia ha kif2 nincs megadva, akkor állandó igaznak tekinthető
● ●
● ●
... ... int inti;i; for for(i=0;i<10;i++) (i=0;i<10;i++) printf("i=%d,i*i=%d\n", printf("i=%d,i*i=%d\n",i,i,i*i); i*i); for for((;;;;)){{ printf("Mikor printf("Mikorlesz leszmár márvége?\n"); vége?\n"); }}... ...
do utasítás ●
do
● ●
utasítás; while(feltétel); ●
előbb végrehajtja az utasítást, majd értékeli a kifejezést ● ●
... ... char charc; c; do do cc==getchar(); getchar(); while while(c (c== ==' '' '||||cc== =='\t'|| '\t'||cc== =='\n'); '\n');
char charc; c; while while((c=getchar())==' ((c=getchar())=='' ' ||||c=='\t' c=='\t'||||cc== =='\n' '\n'););
continue utasítás ●
az őt tartalmazó ciklus következő iterációját megkezdését idézi elő.
● ●
... ... #define #defineESC ESC0x1b; 0x1b; ... ... char charc; c; while while((c=getchar()) ((c=getchar())!= !=ESC) ESC){{ ifif(c (c<<'0' '0'||||cc>>'9') '9') continue; continue; printf("next printf("nextletter letteris:%c",c); is:%c",c); }}
Tömbök I. ●
●
●
●
[] operátor típus tömbazonosító[méret] méret: pozitív egész értékű állandó kifejezés, a tömb elemszámát határozza meg. Az első elem indexe minden esetben: 0
Tömbök II. ●
kezdeti értékadás: int szamok[]={42,2,37,91,-3}; -módodítható:
●
szamok[3]=42;
●
●
konstans tömb: const int szamok[]={42,2,37,91,-3};
●
nem módosítható:
●
szamok[3]=42;
Karakter tömb I. ●
char nev[30];
●
nev[0]='K';
●
nev[1]='i';
●
nev[2]='s';
Karakter tömb II. ●
char gyumolcs[6];
●
gyumolcs[0]='a';
●
gyumolcs[1]='l';
●
gyumolcs[3]='m';
●
gyumolcs[4]='a';
●
gyumolcs[5]='\0';
●
char gyumolcs=”alma”;
Mutatók I.
Mutatók II.
Mutatók III.
Mutatók IV.
Memória modell
Memória allokáció
Lazítás: A Bábel hal ●
●
●
„A Bábel-hal […] kicsi, sárga és piócaalkatú, s valószín űleg a legfurcsább lény a világegyetemben. Agyhullám-energián él, mégpedig nem a hordozójáén, hanem azokon, amelyek kívülről érik a hordozóját. A beérkező agyhullám-energiák összes tudat alatti mentális frekvenciáját abszorbeálja, és testébe építi. Majd exkrementumként a hordozója agyába üríti azt a telepatikus mátrixot, amely a tudatos mentális frekvenciák és a hordozó elme beszédközpontja idegi jelzéseinek kombinálásából adódik. Mindez gyakorlatilag azt jelenti, hogy aki Bábel-halat dug a fülébe, az azonnal megért bárkit bármilyen nyelven. A ténylegesen hallott beszédelemek dekódolják azt az agyhullámmátrixot, amelyet a Bábelhal táplál a hordozója agyába.”
Lazítás: A Bábel hal II. ●
●
●
●
●
●
A GALAXIS Útikalauz Stopposoknak szerint a Bábel-hal Isten nem-létezésének egyik alapvető (bár elég kétes, lásd. a fekete az fehér) bizonyítéka: „Mármost bizarrul valószínűtlen, hogy pusztán az evolúció tiszta véletlenje eredményeképpen létrejöhet valami, ami ennyire észbontóan hasznos. Ezért néhány gondolkodó egyenesen Isten nem létezésének végső és legkézenfekvőbb bizonyítékát látja benne. E gondolkodók nagyjából így érvelnek: – Nem vagyok hajlandó rá – mondja az Úr –, hogy létezésemről bizonyítékot szolgáltassak. Mert a bizonyíték kizárja a hitet, s hit nélkül én semmivé válok. – A Bábel-hal viszont – így az Ember – kész lebukás, nem? Sose fejlődött volna ki véletlenül. Tehát létezésedet bizonyítja, ez esetben pedig a saját érvelésed alapján nem létezel. Quod erat demonstrandum (Ezt kellett bizonyítani). – A fenébe – mondja az Úr. – Erre nem is gondoltam – és menten felszívódik egy logikai buborékban. – Ez könnyen ment – mondja az Ember, és gyorsan megpróbálja bebizonyítani, hogy a fekete az fehér, míg el nem gázoltatja magát a legközelebbi zebránál.”
Kódolási szabályok ●
●
Nem része a szabványnak Sok programozó több éves munkájából kikristályosodott ajánlás-gyűjtemény
file-ok ●
●
Egy forrásfile-ba csak logikailag szorosan összetartozó függvények kerülhetnek. A forrás file-ok mérete nem lépheti túl az 500 sort.