Operatori ar blakusefektiem

Last modified by superadmin on 2018-01-12 20:37

Operatori ar blakusefektiem

Javā tāpat kā citās imperatīvajās programmēšanas valodās, izteiksmes aprēķina mazliet savādāk nekā tradicionālajā matemātikā, t.i. izteiksmju izpildes gaitā jārēķinās, ka mainīgie var iegūt jaunas vērtības pat vienas formulas robežās. Šādas parādības sauc par blakusefektiem (side-effects). Aprakstīsim svarīgākās situācijas, kad Javā rodas blakusefekti.

Operandu aprēķināšanas secība

Izteiksmei vispirms rēķina operandus no kreisās uz labo pusi, pēc tam izpilda operāciju saskaņā ar tās precedenci un asociativitāti.
int[] a = { 0, 0 };
int b = 0;
a[b] = b = 1;
Trešajā rindiņā vispirms izrēķinām a[b], kurš ir masīva 0-tais elements: a[0], abi pārējie operandi (b un 1) jau ir izrēķināti. Visas darbības šajā fāzē veicam no kreisās uz labo pusi. Pēc tam veicam piešķiršanas no labās uz kreiso pusi, t.i. vispirms b kļūst 1, bet pēc tam arī a[0] kļūst 1, jo izteiksmei b=1 arī ir vērtība 1.

Pirmspalielināšana un pēcpalielināšana

int a=3;
int b=a++; // sufiksa palielināšana notiek
           // pēc izteiksmes aprēķināšanas,
           // t.i. beigās b ir 3, un a ir 4.
int c = 3;
int d = ++c; // gan c, gan d ir 4.

Sarežģītāki piemēri

int a = 3;
int b = a++ + a++; // a ir 5 un b ir 7
int c = 3;
int d = 2*c++; // c ir 4 un d ir 6
int[] m = {0, 0, 0, 0};
int a = 1;
m[a++] += a++; // a ir 3 un m ir {0, 2, 0, 0}

Vai šajā piemērā 3. rindiņā saskaitāmos drīkst mainīt vietām tā, lai izteiksmes vērtība nemainītos? 

int[] m = {0,1,2,3};
int a = 1;
m[a++] = m[a++]++ + m[a++]; // a ir 4 un m ir {0,5,3,3}
Tags:
Created by Kalvis Apsītis on 2008-05-04 16:37
    
This wiki is licensed under a Creative Commons 2.0 license
XWiki Enterprise 6.4 - Documentation