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:
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ä }