F. Drewes, Inst. f. datavetenskap1 Föreläsning 7: Uttryck och sidoeffekter Uttryck Sidoeffekter Överladdning Tilldelningar i uttryck
F. Drewes, Inst. f. datavetenskap2 Uttryck Några vanliga typer av uttryck aritmetiska uttryck handlar om tal (+, ,…) booleska uttryck handlar om sanningsvärden (&&, ||, …) relationsuttryck jämför värden (<, =, …) konditionala uttryck väljer mellan alternativ (t.ex. i Java even(x) ? x : x+1) Ett uttryck är en notation som står för ett värde. Uttryck innebär abstraktion: Programmeraren behöver inte syssla med instruktionssekvensen som räknar ut värdet. Uttryck bör helst sakna effekt!
F. Drewes, Inst. f. datavetenskap3 Sidoeffekter Exempel: utvädera x – x++ + x i Java Utan sidoeffekter är evalueringsordningen irrelevant i E E' får antingen E eller E' utvärderas först – eller båda samtidigt ibland behövs värdet av E eller E' inte alls kompilatorn kan optimera programmet Lat evaluering (eng. short-circuit evaluation) av booleska eller andra uttryck blir problematisk Om evalueringen av ett uttryck påverkar värdet av en variabel är det en sidoeffekt. I så fall är uttrycket inte längre bara en notation för ett värde ( ökande komplexitet).
F. Drewes, Inst. f. datavetenskap4 Överladdning Bra (t.o.m. nödvändigt) för att förenkla språk vem vill jämt och ständigt särskilja float + float och int + int? Kräver omtänksam språkutveckling – motexempel: x&y mot &y('&' för både 'och' och adressoperator i C) a = b = c('=' för både tilldelning och likhet i PL/I) average = sum / count (i Java: visst menas inte heltalsdivision?) Om användaren kan överladda identifierare medför det både för- och nackdelar (läsbarheten kan öka) En identifierare är överladdad (eng. overloaded) om den har flera olika betydelser beroende på kontexten (t.ex. '+' som symbol för både plus och konkatenering).
F. Drewes, Inst. f. datavetenskap5 Tilldelningar i uttryck I C, C++, Java är x = E inte bara en tilldelning utan också ett uttryck vars värde är Es värde (som alla vet?). Fördelar kan utnyttjas för att koda koncist, t.ex. if (odd(y=f(x))) y++; kan tilldela ett värde till flera variabler samtidigt (eng. multiple targets), t.ex. x = y = z = E; Nackdelar är "sidoeffekten par excellence" program blir väldigt fort oläsbara om inte programmeraren är försiktig