Conditionele expressie

Post on 30-Dec-2015

37 views 0 download

description

Conditionele expressie. expressie1 ? expressie2 : expressie3 Vb. z = (a < b ? a + 1 : b – 1) If (a < b) z = a + 1 else z = b – 1; Voordeel: compactere code. De komma-operator. expressie1 , expressie2 - PowerPoint PPT Presentation

Transcript of Conditionele expressie

Conditionele expressie

expressie1 ? expressie2 : expressie3

Vb. z = (a < b ? a + 1 : b – 1)

If (a < b) z = a + 1 else z = b – 1;

Voordeel: compactere code

De komma-operator

expressie1 , expressie2

Beide expressies worden in gegeven volgorde geëvalueerd en de waarde van expressie2 wordt als waarde van de gehele komma-expressie afgeleverd

Komma-operator voorbeeld

S = 0;while (cin >> i , i > 0) s+=i;

Het afsluiten van een rij ingetypte getallenint main(){double s=0,x;cout << “Tik getallen in,gescheiden door spaties,\n” << “met een regel tekst na het laatste getal:\n”;while (cin >> x , !cin.fail()) s+= x;cin.clear();

char ch;do cin.get(ch); while (ch != ‘\n’);

cout << “de eerste som is “ << s << endl;s = 0;cout << “Nog een keer alstublieft:\n”;while (cin >> x , !cin.fail()) s+= x;cout << “de tweede som is “ << s << endl;return 0;}

bitmanipulatie

• & bitsgewijze EN : 1001 & 1100 = 1000• | bitsgewijze OF : 1001 | 1100 = 1101• ˆ bitsgewijze XOR : 1001 ^ 1100 = 0101• ˜ INVERSIE: ˜1010 = 0101• « SCHUIVEN NAAR LINKS:

0101 1010 << 3 = 1101 0000

• » SCHUIVEN NAAR RECHTS(machine- / compilerafhankelijk) 0101 1010 >> 3 = 0000 1011

unsigned

• Kan voor short, int en long • Unsigned = unsigned int• Variabelen van deze types kunnen

niet negatief worden• Meest linkse bit is geen tekenbit,

maar macht van 2• Positief getalbereik X 2

Eenvoudige arrays

int a[100];

a[0],a[1],…,a[99]

a[3 * i + 1]

const int aantal = 100;int a[aantal];

Array initialiseren

int a[3] = {15,20,8};float b[4] = {12.0,3.1};

float c[5];

b[4] = {12.0,3.1,0,0}

char naam = “Jan”;

char naam = {‘J’,’a’,’n’};

Definitie en declaratie van een functie#include <iostream>using namespace std;

float fun (float x, float y, int i, int j){int noemer = i – j; return noemer == 0? 1e20 : (x – y)/noemer}

int main(){float xx, yy; int ii,jj;cout << “Geef twee float en twee int waarden:”;cin >> xx >> yy >> ii >> jj;cout << “berekende functiewaarde:”; << fun(xx,yy,ii,jj) << endl;return 0;}

functies

• Type-conversie voor parameters en return waarde (!automatische conversie van vb. double naar int = afkapping)

• Volgorde van functies (altijd declareren voor gebruik; definitie kan later)

• void• geen parameters

Klasse met lidfuncties

• Lidfuncties = methoden uit java• class naam {

public: …

private: …

}int main(){

…}

klasse

• vkv v;• Object van het type vkv aanmaken

(geheugenruimte voorzien voor de lidvariabelen)

• v.coeff(a,b,c) (lidvariabelen a,b,c van v krijgen waarden uit main)

• double wortel1() const {return x1;}(const object v ongewijzigd door oproep)

• Lidvariabelen graag private• struct ipv class (default public ipv private)

klassen

• Lidfuncties buiten de klasse definiëren• Wanneer? Als de functies wat

uitgebreider zijn• Wel declareren binnen de klasse; definitie

erbuiten:Vb. in klasse:bool losOp(); (declaratie)

buiten klasse: bool vkv::losOp() …

(definitie)

constructoren

• Cf java: i.e.lidfuncties die automatisch worden aangeroepen bij het creëeren van een nieuw klasse-object naam = naam klasse

• geen new (java) vkv(1.0,2.0,3.0)

Constructor zonder parameters: vkv v; niet vkv v();!

Overloading en default-parameters

• Onderscheid door het aantal en/of type van parameters • Zowel voor constructors, lidfuncties als

functies in programma• Default-waarden aan parameters geven

binnen delaratie of definitie; zelfde constructor (of lidfunctie) wordt gebruikt met één of meer argumenten, voor overige worden achteraan beginnend default-waarden verondersteld

& en const bij parameters• Cf. vensters.cpp p. 86• venster omvattend (venster v) {...}

• v is waardeparameter dwz KOPIE VAN van v doorgeven aan functie

• origineel kan niet wijzigen door de uitvoer van de functie, aangezien het gaat om een kopie

• venster omvattend (venster &v) {...}• v is referentieparameter, dwz WIJZER NAAR

(= adres van) v doorgeven (efficiëntie!)• Origineel kan WEL veranderen door het

uitvoeren van de functie

& en const bij parameters

• venster omvattend (const venster &v){…}• Door const te gebruiken geven we aan dat

het onmogelijk is binnen de functie het argument te wijzigen (veiligheid!)

& en const bij parameters

1. Schrijf geen & en const bij primitieve types, tenzij punt 3 van toepassing is

2. Schrijf & en const bij klassetypes, tenzij punt 3 van toepassing is

3. Als je het argument wilt wijzigen, schrijf dan wel & maar geen const

inlining

• Inline functies worden niet geïmplementeerd als gewone functies (op een andere plaats in het geheugen en dan met parameterbindingen), maar de code van de functie wordt gewoon gesubstitueerd op de plaats van de aanroep

• Voordeel: sneller!!• Ook lidfuncties binnen de klasse zal de

compiler implementeren als inline-functies

inlining• Na compilatie, bij uitvoering:

• functie-code ergens in geheugen• bij functie- aanroep:

• voorbereiding: bvb argumenten doorgeven via registers

• Sprong naar functiecode, achteraf sprong terug• nadelig voor zeer korte functies, vooral in lus

• oplossing:• aangeven dat we inline code wensen mbv

keyword inline• compiler kopiëert de functiecode tussen de

overige code : meer code, maar geen sprongen meer!!

Inlining voorbeeld

inline int minimum (int a, int b) {return (a < b ? a : b);}int min = minimum (tel, noem);

int min = (tel < noem ? tel : noem);i. p. v. sprong naar functie