Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

10.2.2 Sijoitus palauttaa arvon!

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

	/* Seuraava tulostaa vain jos a == 5 */
	if ( a == 5 ) tulosta("a on viisi!\n");  /* Kääntyy Javssa ja C:ssä */
	/* Seuraava sijoittaa aina a = 5 ja tulostaa AINA! */	:-(
	if ( a = 5 ) printf("a:ksi tulee AINA 5!\n");  /* Kääntyy vain C:ssä */

Sijoitus a=5 on myös lauseke, joka palauttaa arvon 5. Siis sijoitus kelpaa tästä syystä vallan hyvin loogiseksi lausekkeeksi C-kielessä. Onneksi Javassa tämä sijoituksen tuloksena synytynyt lausekkeen kokonaislukuarvo EI kelpaa boolean-arvoksi, joten kääntäjä ei hyväksy sijoitusta vahingossa yhtäsuuruuden vertailun tilalle..

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:

java-silm\Ifsij2.java - esimerkki tahallisesta sijoituksesta ehdossa

	    int a,b=5;
	    /*1*/  // a = b; if ( b ) tulosta("b ei ole nolla!");
	    /*2*/  a = b; if ( b != 0 ) tulosta("b ei ole nolla!");
	    /*3*/  // if ( a = b ) tulosta("b ei ole nolla!");
	    /*4*/  if ( (a=b) != 0 ) tulosta("b ei ole nolla!");

Edellisistä tapa 3 on C- mäisin, mutta Java-kääntäjä ei onneksi hyväksy sitä. Jotta C- mäinen tapa voitaisiin säilyttää, voidaan käyttää tapaa 4 jonka kääntäjä hyväksyy. Oleellista on, että sijoitus on suluissa (muuten tulisi sijoitus a =(b!=0) ). Mikäli asian toimimisesta on pieninkin epäilys kannattaa käyttää tapaa 2!

Tyypillinen esimerkki sijoituksesta ja testauksesta samalla on vaikkapa tiedoston lukeminen:

	while ( ( rivi = f.readLine() ) != null ) { // jos sijoitus palauttaa null,
	                                            // on tiedosto loppu
	  ... käsitellään tiedoston riviä 
	}

Jos edellisen esimerkin tiedoston lukemisessa ei käytettäisi sijoitusta ja testiä samalla, pitäisi tämä kirjoittaa muotoon:

	while ( true ) {
	  rivi = f.readLine();
	  if ( rivi == null ) break;
	  ... käsitellään tiedoston riviä
	}


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys