previous next Up Title Contents Index

10.2.2 Sijoitus palauttaa arvon!

Yhtäsuuruutta verrataan == operaattorilla, EI sijoituksella =. Tämä on eräs tavallisimpia aloittelevan (ja kokeneenkin) C- ohjelmoijan virheitä:

c-silm\ifsij.c - esimerkki sijoituksesta ehdossa

	/* Seuraava tulostaa vain jos a == 5 */
	if ( a == 5 ) printf("a on viisi!\n");
	/* Seuraava sijoittaa aina a = 5 ja tulostaa AINA! */	
	if ( a = 5 ) printf("a:ksi tulee AINA 5!\n"); 

Sijoitus a=5 on myös lauseke, joka palauttaa arvon 5. Siis sijoitus kelpaa tästä syystä vallan hyvin loogiseksi lausekkeeksi. Onneksi useat C- kääntäjät osaavat varoittaa tästä katalasta virhemahdollisuudesta.

Joskus ominaisuutta voidaan tarkoituksella käyttää hyväksikin. Esimerkiksi halutaan sijoittaa AINA a=b ja sitten suorittaa jokin lause, mikäli b!=0. Tämä voitaisiin kirjoittaa useilla eri tavoilla:

c-silm\ifsij2.c - esimerkki tahallisesta sijoituksesta ehdossa

	/*1*/  a = b; if ( b ) printf("b ei ole nolla!\n");
	/*2*/  a = b; if ( b != 0 ) printf("b ei ole nolla!\n");
	/*3*/  if ( a = b ) printf("b ei ole nolla!\n");
	/*4*/  if ( (a=b) != 0 ) printf("b ei ole nolla!\n");
Edellisistä tapa 3 on C- mäisin, mutta kääntäjä saattaa varoittaa siitä (ja tämä varoitus kannattaa ottaa todesta). Jotta C- mäinen tapa voitaisiin säilyttää, voidaan käyttää tapaa 4 jolloin varoitusta ei tule, mutta generoidaan aivan vastaava koodi. Oleellista on, että sijoitus on suluissa (muuten tulisi sijoitus a =(b!=0) ). Mikäli asian toimimisesta on pieninkin epäilys kannattaa käyttää tapaa 1 tai 2!


previous next Up Title Contents Index