
                            VARIABELNAMN


Om man ser till att vlja sina variabelnamn klokt s blir programmen nstan
sjlvdokumenterande. Det ger en helt annan lslighet om variabeln heter moms 
och inte xyz2 eller ngot annat dumt. I C r variabelnamnens lngd inte be-
grnsade, men kompilatorn ignorerar allt utom de frsta tta tecknen. Det re-
sulterar i att inkomstskatt kommer att tolkas som samma variabelnamn som 
inkomstshund, och det r ju inte s bra. Ett variabelnamn fr best av bok-
stver, a - z och A - Z, men inte . Dessutom fr man anvnda _, allts
understrykningstecknet, som ocks rknas som en bokstav. Siffror r ocks 
tilltna, med den begrnsningen att variabelnamnet aldrig fr brja med en 
siffra. Dremot fr man allts brja med _, men det br man undvika, eftersom
detta r allmnt anvnt till biblioteksfunktioner, och det r ltt att krocka
med biblioteket annars. Vi testar en lista med korrekta och felaktiga varia-
belnamn.

        Korrekt            Fel          Orsak

        Katt3              3katt        Brjar med siffra		
        hundkoja           Hundkoj@     Otilltet tecken
        _vovve             -vovve       Otilltet tecken		
        abrakadabra@$*!                 De felaktiga tecknen ignoreras
        abrakadabra                     

Observera att de tv sista namnen betecknar samma variabel, alla tecken efter
det ttonde ignoreras ju av kompilatorn.



                          DEKLARATIONER OCH TYPER


Liksom i vissa andra sammanhang s mste man deklarera i C. Alla variabler 
mste uppges med namn och typ. Det finns flera goda skl till det. Fr det
frsta underlttar det frstelsen om programmet har en prydlig lista med 
alla variabler och kanske frklaringar till dem i brjan. Fr det andra ger 
det programmeraren en chans att tnka igenom och planera sina variabler redan
innan han brjar med sjlva programmet. Fr det tredje s eliminerar det en
besvrlig felklla, nmligen felstavade variabelnamn, som i Basic ger upphov
till en helt ny variabel och de mest frvnande resultat. C-kompilatorn upp-
tcker genast ett variabelnamn som den inte knner igen. Fr det fjrde s
fungerar inte kompilatorn alls om inte variablerna r deklarerade och redan
det r vl skl nog att gra det, ven om man inte har blivit imponerad av de
frsta tre argumenten.

I C finns det sju olika nyckelord som anvnds fr att beteckna variabeltyper:
char, double, float, int, long, short, unsigned. Observera att alla nyckelord
i C skrivs med liten begynnelsebokstav. 

char    betecknar ett dataelement med storleken 8 bitar. Eftersom den r tec-
        kensatt s antar den vrden frn -128 till 127 och tcker drigenom
        det ndvndiga omrdet fr ASCII-tecken.

float   r systemets normala storlek p ett flyttal. Det kan vara positivt
        eller negativt. I Lattice C p Amiga r ett flyttal 32 bitar och dess
        omrde r frn +/- 10 e-37 till +/- 10 e38. Precisionen hos ett float
        r mellan 6 och 7 decimaler.

double  eller long float r oftast men inte alltid ett flyttal med strre 
        kapacitet n en float. Denna typ tillter i s fall strre exponen-
        ter och/eller fler signifikanta siffror. I vissa system, srskilt om
        en float redan har en avsevrd lngd, s r float och double lika 
        lnga. Detta gller inte Amiga, hr omfattar en double 64 bitar och
        har ett omrde frn +/- 10 e-307 till +/- 10 e308. Precisionen hos 
        ett double r mellan 15 och 16 decimaler.

int     r systemets normala heltal. Det kan liksom float vara positivt eller
        negativt. Lattice C har en intlngd p 32 bitar och ett omrde frn
        -2147483648 till 2147483647. Aztec C har en intlngd p 16 bitar och
        drmed samma omrde som en short.

long    eller long int r minst lika lng som int, men ofta dubbelt s lng.
        I Lattice C r long lika med int, men i Aztec C r long dubbelt s 
        lng som int, dvs long p Amiga r alltid 32 bitar.

short   eller short int r hgst lika lngt som int, men kan ocks mindre.
        P Amiga r short 16 bitar med ett omrde frn -32768 till 32767.

unsigned slutligen anvnds som modifierare till int-typerna och anger att 
        deras tilltna omrde r noll eller positiva vrden. Hrigenom utkas
        naturligtvis deras maxvrde till det dubbla gentemot den teckensatta
        motsvarigheten, eftersom det inte behvs ngot tvkomplement fr att
        beteckna negativt tal. Sledes fr unsigned char ett omrde frn 0 
        till 255, unsigned short 0 - 65535, unsigned int 0 - 4294967295.

S hr lngt var det inte s konstigt. Det som kan stlla till problem r 
frsts de olika typernas lngd. Om det inte gr att lsa sig till dem i sys-
temets handbok, s kan man alltid lta C sjlvt svara p det genom funktionen
sizeof(), som returnerar lngden p argumentet i bytes. I Lattice C till 
Amiga till exempel blir sizeof(int) 4, medan i Aztec C blir det 2. 

Det r dock inte slut med detta n. Dels finns det mjligheter att definiera
egna typer via frprocessorn och dess kommando #define. Amiga har en hel 
massa olika ssom UBYTE, BYTEBITS, ULONG, APTR osv. Alla dessa r helt en-
kelt andra namn p grundtyperna fr att det ska vara lttare att se vad 
variablerna verkligen innebr. S finns det mjlighet att skapa helt egna 
typer genom nyckelordet typedef, som till skillnad frn #define handhas av
kompilatorn och ger nnu strre frihet att definiera datatyper. S har vi
ocks de sammansatta typerna struct, union och enum. Srskilt datastrukturen,
struct, r viktig fr Amigaprogrammeraren eftersom praktiskt taget alla 
Amigafunktioner arbetar med strukturer. Vi terkommer dit senare.



                         TILLDELNING


Efter att vi nu har definierat vra variabler s r det dags att tilldela 
dem vrden. Det sker enklast i en tilldelningssats med hjlp av tilldelnigs-
operatorn =. Om du tycker att den liknar ett vanligt likhetstecken till ut-
seendet s kan det stmma. Funktionen r emellertid en annan. Tilldelnings-
operatorn i C tilldelar variabeln til vnster vrdet av uttrycket till hger
om operatorn. Ett enkelt exempel:

   	Gurka = 7;

Sedan denna sats utfrts har variabeln Gurka vrdet 7. Eftersom det r en 
sats s mste den avslutas med ett semikolon. Det finns inget som hindrar att
vi senare ger Gurka ett annat vrde. Det r ju faktiskt en variabel och ingen
konstant.



                              KONSTANTER


S kom vi d oskt in p konstanter ocks. Den stora skillnaden mellan vari-
abler och konstanter r frsts att konstanter har vrden som r ofrnder-
liga. Av den orsaken kan man gott definiera pi som en konstant, men dremot
momsen br nog vara en variabel om man inte ska behva skriva om sitt program
s snart konjunkturen behver stimuleras. I likhet med variablerna s kan 
konstanter vara av olika typer, heltal, flyttal, tecken och strngar. Fr att
gra det nnu krngligare s kan man anvnda inte bara decimala heltal, utan
ocks oktala och hexadecimala. Om ett tal i C brjar med 0 s innebr det att
det r ett oktalt tal, och om talet brjar med 0X eller 0x s r det hexade-
cimalt. Heltal lagras i C normalt direkt i binr form, medan flyttal lagras 
uppdelat i en decimaldel och en exponent, och naturligtvis en teckendel fr
att skilja mellan positivt och negativt. Decimalkommat i flyttalet flyttas
s mnga steg som behvs fr att talets heltalsdel skall bli noll, och an-
talet steg ger exponenten. Decimaldelen och exponenten lagras i binr form.
Den tilltna storleken p exponenten och antalet decimaler i decimaldelen r
bestmda av systemet. Lagringsproblemet uppkommer frsts frst nr en varia-
bel ska tilldelas konstanten som vrde, d gller det att se till att man har
valt rtt typ och storlek p variabeln fr att vrdet ska f plats i den.

En teckenkonstant bestr av ett enda ASCIItecken, och i C betecknas den genom
att omges av apostrofer s hr: 'C'. En teckenkonstant lmpar sig fr att 
tilldela en variabel av typen char ett vrde:

char bokstav;
bokstav = 'C';  

Glm aldrig apostroferna, fr d tror kompilatorn att vi anvnder en variabel
som heter C och som vi dessutom har glmt att deklarera och initiera.

Det finns ju en del ASCIItecken som r oskrivbara, men fr dem finns det ett
par bra skrivstt. Fr det frsta kan man anvnda ASCIIkoden direkt, bara man
skriver ett snedstreck frst. Tecknet "escape" kan vi allts skriva som '\27'
eller varfr inte som '\033' om vi vill anvnda den oktala formen. Fr vissa 
av de besvrliga tecknen finns det srskilda s kallade escapesekvenser. De
inleds med tecknet \, som i det sammanhanget kallas fr escapetecken. Blanda
inte ihop det med ASCIItecknet escape. Fem stycken tar vi upp hr, och dess-
utom visar vi hur man skriver ngra andra besvrliga tecken:

        Tecken			C-beteckning		ASCIIvrde

        null			'\0'			0
        backsteg		'\b'			8
        tab			'\t'			9
        ny rad			'\n'			10
        formfeed, ny sida	'\f'			12
        return, vagnretur	'\r'			13
        citationstecken		'\"'			34
        apostrof		'\''			39
        snedstreck		'\\'			92 

Det gr frsts att skriva alla dessa med ASCIIkodmetoden, men om man anvn-
der dessa tecken s fungerar programmet ocks i miljer dr andra teckenkoder
anvnds, till exempel IBM stordatorer. Dessutom r de betydligt lttare att 
komma ihg bde nr man lser och skriver program.

Nr vi vill jobba med flera tecken p en gng s rcker det inte lngre med
en char, fr den rymmer ju bara ett enda tecken. Istllet mste vi anvnda
oss av strngar. En strng bestr av ett godtyckligt antal godtyckliga tecken
omgivna av citationstecken. Dessutom mste i C en strng alltid avslutas med 
ett nolltecken, \0. Varje strng r allts en teckenposition lngre n dess
nyttiga innehll. Lt oss visa ett exempel: "Hello World". Denna strng har
11 nyttiga tecken, och lagras i minnet i 12 positioner s hr:

        72 101 108 108 111 32 87 111 114 108 100 00
        H   e   l   l   o     W   o   r   l   d  \0

Lgg nu mrke till att det finns en fundamental skillnad mellan en strng-
konstant och en teckenkonstant. "A" och 'A' r allts inte detsamma, utan 
strngen "A" bestr ju av de tv tecknen A och \0, medan teckenkonstanten
'A' bara innehller tecknet A. 

Vi vntar lite med att g igenom strngar och deras lagring lite noggrannare
och kastar oss istllet ver frprocessorn igen.



                          SYMBOLISKA KONSTANTER


Ett program som har en massa konstanter i sig blir ltt lite svrlst om man 
inte r flitig med kommentarerna. Dessutom blir det ett jttejobb att hitta
och ndra p alla stllen om man behver justera en konstant. Vi tar moms-
satsen som exempel. Om konstanten 23.46 frekommer p mnga olika stllen i 
ditt faktureringsprogram s vet kanske du och ngra till att den betecknar 
den nuvarande momssatsen. Men din kusin i Amerika kommer att undra vad du har
fttt dessa underliga siffror ifrn. Frprocessorn ger oss en mjlighet att
gra programmet begripligare och lttare att modifiera. Vi definierar helt
enkelt en symbolisk konstant som vi kallar MOMSSATS. Den stter visserligen 
fortfarande myror i huvudet p amerikanen s vi kan ndra den till SALES_TAX
i stllet.

	#define SALES_TAX 23.46

Teckenfljden SALES_TAX kallas fr en makro. Den fr inte innehlla mellan-
slag, och konvenansen sger att den skrivs med stora bokstver ven om detta
inte r obligatoriskt. Vid kompileringen kommer nu frprocessorn att erstta
varje frekomst av makron SALES_TAX med teckenstrngen "23.46". Det r allts
frga om ett rent teckenutbyte som grs innan sjlva kompileringen brjar. Om
nu regeringen ndrar momsen s behver du bara ndra i frprocessorinstruk-
tionen och kompilera om, s ndras automatiskt alla frekomster av momssat-
sen i programmet. Eftersom det gr att byta ut vilka strngar som helst s 
kan man definiera hela programdelar som macros. Vissa kompilatorer begrnsar
dock storleken p macrodefinitionerna till en rad. 

Frprocessorn kommer vi att gna mer utrymme lngre fram.
