### Pri C

1. Ĝeneralaĵoj pri C
2. La operacisimboloj de C
3. Kromnomoj de C++
4. Ekzemplaj C-programoj
5. Leksiko de C: Provo pri esperantigo

#### Ĝeneralaĵoj pri C

Programo en C estas kolekto de moduloj. Ĉiu modulo havas formon de teksta dosiero kun la sufikso`.c` kaj estas tradukebla aparte. La datumoj, atingeblaj el aliaj moduloj, estas specifendaj en la ĉapo de modulo; kutime tiajn specifojn oni arigas en interfacaj ĉapdosieroj kun la sufikso`.h` (ekz-e `<stdio.h>` en ekzempla programo Duoniga serĉo en C).

Por ricevi plenumeblan programon necesas bindi la dise kompilitajn modulojn.

Normale C-modulo estas unue antaŭtraktata, poste tradukata. La plej ofte uzataj antaŭtraktilaj rimedoj estas la komandoj`#include` («inkludu»; ĝi kvazaŭ kopias sian operandan dosieron en la lokon kie ĝi aperas) kaj`#define` («difinu»; ofte uzata por difini konstantojn, kiel en nia ekzemplo). Krome, uzante la antaŭtraktilon eblas esperantigi la vortosimbolojn de C (Leksiko de C).

C-modulo estas sekvenco de deklaroj validaj en la koncerna dosiero. Deklaro de variablo aŭ funkcio estas aŭ loka al la dosiero (`static`, «statika»), aŭ malloka kaj valida por la tuta programo (`extern`, «ekstera»). Por uzebligi mallokajn nomojn en aliaj moduloj, la koncernajn deklarojn (eventuale, iom reduktitajn) necesas meti en interfacan ĉapdosieron, inkludotan en ĉiun uzantan modulon. (Tio estas analogia al la difinaj kaj realigaj moduloj de MODULA.) La deklaroj povas enteni oportunan komencvalorizon.

La tekston de C-modulo oni povas sufiĉe libere intermiksi kun komentoj; la komentaj krampoj havas la formon

`/* … */`
La normo permesas uzi ankaŭ C++-stilajn komentojn, kiujn malfermas`//` kaj fermas linifino.

Datumtipo en C povas esti simpla aŭ kunmetita. Inter la unuaj C disponigas plurajn entjerajn kaj reelajn tipojn, por difini la duajn, kvin tipkonstruilojn: tabelo, rikordo `struct`, referenco, unio, funkcio; krome, estas fikcia vakua tipo`void`. Per tipdifina frazo`typedef` (la 3-a linio de la ekzempla programo Duoniga serĉo en C) oni povas atribui al datumtipo nomon.

C havas unuecan sintakson por difini kunmetitan datumtipon kaj por esprimi ties malkomponon (atingi anojn de kunmetita valoro, voki funkcion ktp). Ekz-e,

`int (*rf)(float);`
deklaras variablon`rf` referenci funkcion havantan unu glitpunktan (sekve, reelan) parametron kaj liverantan entjeron. La sintakso de funkcivoko per`rf` havas tian saman formon:
`i = (*rf)(2.78);`
(la unua krampoparo necesas por indiki, ke la elreferencado aplikendas al la funkcinomo, ne al la rezulto de la funkcivoko).

C disponigas seon `if` (linioj 8–10 de la ekzemplo) kaj kazan ordonon `switch` por branĉado, komenckondiĉan iteracion `while` (linioj 6–11 de la ekzemplo), tre lozan nombrilan iteracion `for` (kiu eventuale povas esti sennombrila), funkcivokon kaj revenordonon (linioj 8 kaj 12), tre oportunan parentezan ordonon (inter «`{`» kaj «`}`», ekz-e la korpo de la iteracio). C havas markojn kaj saltojn, sed ankaŭ pli altnivelajn elirejojn `break`,`return` kaj iom pli specialan`continue`, per kiuj oni povas pli facile eviti markojn ol en Paskalo.

La pli granda parto de C-programo konsistas el esprimoj. Simile al ALGOL-68 kaj malsimile ol Paskalo kaj Ada, C estas «esprimema» lingvo. Tio signifas, ke multaj programfrazoj, kiujn oni tradicie rigardas ordonoj — precipe la valorizo — en C estas uzebla en esprimoj (tiel estas en la linio 8).

Laŭ Fortrana tradicio la valorizo estas signata per`=`, por la egalaĵo uzendas`==`. Tio estas fonto de malfacile troveblaj eraroj por programistoj edukitaj en la tradicio de ALGOL (ekz-e por mi). La problemo estas pli severa ol en FORTRAN, ĉar C permesas havi valorizojn en kondiĉoj. Por fari tiajn erarojn pli kontroleblaj iuj preferas skribi

`if(n + 1 == x)`
anstataŭ
`if(x == n + 1)`
ĉar se unu egalsigno perdiĝos pro la influo de la tradicia skribo matematika aŭ aparata misfunkcio, la tradukilo plendos pri malebla valorizo`n + 1 = x` (bedaŭrinde, tio ne helpas se oni bezonas testi`x==y`).

La operacisimboloj en C havas 15 prioritatojn, kio estas tro multe por averaĝa homo, kaj la prudentuloj ne ŝparas krampojn. Por pliaj detaloj vd ekzemplojn (Paralelaj tekstoj en C kaj Paskalo).

#### La operacisimboloj de C

Prioritato | Operacisimbolo | Loknombro | Asociado
--- | --- | --- | ---
1 | `() [] -> . sizeof i++ i--` | 1; 2 | dekstren
2 | `! ~ - * & (`altipigo`) ++i --i` | 1 | liven
3 | `* / %` | 2 | dekstren
4 | `+ -` |  |
5 | `<< ››` |  |
6 | `< <= ›= ›` |  |
7 | `== !=` |  |
8 | `&` |  |
9 | `^` |  |
10 | `|` |  |
11 | `&&` |  |
12 | `||` |  |
13 | `?:` | 3 | liven
14 | `= += -=` | 2 |
15 | `,` | dekstren

#### Kromnomoj de C++

En C++ la kromnomoj ebligas fari elreferencadon implica, kp

       void ordigu(int *p, int *q) | void ordigu(int &p, int &q)
       { int t;                    |    { int t;
         if(*p > *q){              |      if(p > q){
           t = *p;                 |        t = p;
           *p = *q;                |        p = q;
           *q = t;                 |        q = t;
         }                         |      }
       }                           |    }