C++ versus Java 1. C++ versus Java



Like dokumenter
Del 1 En oversikt over C-programmering

Kapittel 1 En oversikt over C-språket

Del 4 Noen spesielle C-elementer

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Programmeringsspråket C

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter i dag! Klart for første oblig

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

156C. Algoritmer og maskinspråk. IT1101 Informatikk basisfag. Maskinspråk: det maskinen forstår. Assembler / assemblerspråk

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

2 Om statiske variable/konstanter og statiske metoder.

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Kontinuasjonseksamen

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF3110 Programmeringsspråk. Velkommen til kurset INF 3110/4110. Programmeringsspråk 1/24

INF 3110/4110. Velkommen til kurset. Programmeringsspråk. Først det praktiske

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Del 3: Evaluere uttrykk

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

En oppsummering (og litt som står igjen)

Kontinuasjonseksamen

INF1000 Metoder. Marit Nybakken 16. februar 2004

Kontinuasjonseksamen

IN 147 Program og maskinvare

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

UNIVERSITETET I OSLO

Løse reelle problemer

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Repetisjon fra sist - 1: Plan for dagen. Repetisjon fra sist 2: Hva jeg glemte sist: Nyttige Kommandoer

Generiske mekanismer i statisk typede programmeringsspråk

Litt om Javas class-filer og byte-kode

Kapittel 1: Datamaskiner og programmeringsspråk

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Kapittel 8: Programutvikling

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

TDT4102 Prosedyreog objektorientert programmering Vår 2016

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kapittel 7: Mer om arv

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

Programmeringsspråket C

Kontinuasjonseksamen

UNIVERSITETET I OSLO

Beskrivelse av programmeringsspråket Simpila INF Kompilatorteknikk Våren 2012

2. Pekere og referanser.

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

TDT4100 Objektorientert programmering

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Introduksjon til objektorientert programmering

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

NOTAT (pensum!) Javas klasse-filer, byte-kode og utførelse. INF 5110, 10/5-2011, Stein Krogdahl

JAVA CHRISTOFFER MARTINSEN

INF1000: Forelesning 7

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Forelesning inf Java 5

Programmeringsspråket C

INF1010 våren Arv og subklasser - del 2

Forelesning inf Java 5

TOD063 Datastrukturer og algoritmer

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

INF1000: noen avsluttende ord

Kontinuasjonseksamen

INF1000: Forelesning 7. Konstruktører Static

BOKMÅL Side 1 av 12. Fakultet for informasjonsteknologi,

Inn og ut i C/C++ 1. Inn og ut i C/C++

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.2

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

2 Om statiske variable/konstanter og statiske metoder.

INF1000 : Forelesning 1 (del 2)

Transkript:

Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag C++ versus Java Tore Berg Hansen 29.8.2006 Lærestoffet er utviklet for faget LV194D C++ for Javaprogrammerere 1. C++ versus Java Resymé: I denne leksjonen intoduserer vi C++ ved å se på forskjellene og likhetene mellom C++ og Java. Som ramme for sammenligningen tar vi et språkteoretisk utgangspunkt. Innhold 1.1. INNLEDNING... 2 1.2. HVORFOR LÆRE C++?... 2 1.3. HVILKE FORSKJELLER KAN MAN VENTE?... 3 1.4. ET SPRÅKTEORETISK UTGANGSPUNKT... 3 1.4.1. Hva karakteriserer programmeringsspråk?... 3 1.4.2. Strukturen i et program... 4 1.5. LIKHETER OG FORSKJELLER... 5 1.5.1. Nøkkelord og operatorer... 6 1.5.2. Slik er programmer bygget opp... 12 1.5.3. Datatyper... 13 1.6. LITTERATUR... 16

C++ versus Java side 2 av 16 1.1. Innledning Faget heter C++ for Java-programmerere. Det betyr at det er ment å tas av personer med kunnskap om programmering i sin allminnelighet og som dessuten kjenner til objektorientert programmering. Derfor forutsetter vi at vi kan hoppe raskt over de grunnleggende ting om programmering og se på det man spesielt må vite for å kunne skrive programmer i C++. En Java-programmerer vil ikke ha store problemer med å lære de grunnleggende tingene i C++. Språkene tilhører den samme familie av programmeringsspråk (på fagspråket det samme paradigme). De som utviklet Java har hentet mange ting fra C++ og tok bl.a sikte på å lage en bedre C++ uten de tingene som gjør C++ vanskelig. C++ er et mer omfattende språk enn Java. En årsak til det er at C++ er bakoverkompatibelt med C. C++ er et generelt programmeringsspråk som kan brukes både til å skrive objektorienterte programmer og tradisjonelle C programmer. Java på den annen side er utelukkende objektorientert. 1.2. Hvorfor lære C++? Ja, hvorfor skal man lære C++ hvis Java er en bedre C++? Egentlig er det ikke noe enkelt svar på det spørsmålet. Og du får forskjellig svar avhengig av hvem du spør. Ettersom vi har utarbeidet dette faget mener vi selvsagt at det er flere gode grunner til å lære C++. Her er noen hovedgrunner: En undersøkelse har vist at det finnes rundt 4000 programmeringsspråk i dag. Og antallet er økende. Det dette bl.a forteller er at det ikke finnes et enkelt språk som er best for alle typer programmeringsoppgaver. Svært mange av disse språkene er laget for å optimalisere helt spesielle typer av programmeringsoppgaver. Altså bør du kjenne til flere språk for å kunne gjøre begrunnede valg av hvilket programmeringsspråk som passer best for gitte oppgaver. Når vi mener at C++ er et av de språkene det er nyttig å kjenne til, skyldes det ikke minst historien. I de siste 20 årene har C++ og C vært det mest brukte språk til utvikling av viktige typer kommersiell programvare. Det vil si at det finnes massevis av programmer som fremdeles er i bruk som er skrevet i disse språkene. Skal du jobbe som profesjonell programmerer vil du med stor sannsynlighet på en eller annen måte måtte forholde deg til C++ eller C programmer. Du kan komme til å delta i videreutvikling eller få jobben med å konvertere slike programmer. Dessuten er det slik at spillprogrammerere ser ut til å foretrekke C/C++. C++ er bedre enn Java når kravet til eksekveringshastighet er kritisk. Likedan åpner C++ for tett samspill mellom programmet og maskinvaren/operativsystemet. Årsaken ligger i det som er noe av hovedforskjellen i filosofi mellom C++ og Java. Java er utviklet for å være et utelukkende objektorientert språk. Programmer skrevet i språket skal kunne kjøre på all type maskinvare og være uavhengig av operativsystem. Det er lagt vekt på sikkerhet, spesielt med tanke på at programmer skal brukes i applikasjoner på Internett. Java appletter kan ikke skrive til disk eller inn/ut-porter. Programmer skrevet i Java er avhengig av en virtuell maskin mellom programmene og maskinvaren/operativsystemet. Denne virtuelle maskinen (som ofte er skrevet i C) tolker en spesiell byte-kode som Java-kompilatoren lager. Byte-kode som må tolkes er mindre effektiv enn optimalisert maskinkode laget av en

C++ versus Java side 3 av 16 (C/C++)kompilator for en bestemt plattform. Java er et viktig språk, men vil ikke være det eneste språket. Det er kun enda et språk. Trenger man en applett for Internett eller virkelig plattformuavhengighet velger man Java. Hvis man trenger effektivitet og fleksibilitet velger man C++. Et eksempel kan være spill. 1.3. Hvilke forskjeller kan man vente? Du har altså bakgrunn i Java og skal lære et nytt programmeringsspråk. En tilnærming er å se på likheter og forskjeller. Det man gjerne lurer på er slike ting som hvordan strukturen på programmene er, hvilke datatyper språket tilbyr, hvilke navnekonvensjoner gjelder for variabler og konstanter, hvilke reserverte ord finnes og hvilke løkke og valgstrukturer har man. Når det gjelder mange av disse tingene er forskjellene mellom C++ og Java små fordi språkene tilhører det samme paradigme. For å få litt orden på sammenligningen skal vi legge en kort språkteoretisk ramme rundt sammenligningen. 1.4. Et språkteoretisk utgangspunkt 1.4.1. Hva karakteriserer programmeringsspråk? For å nærme oss dette kan vi først se på en måte å inndele programmeringsspråk på. I terminologien rundt programmeringsspråk gjøres denne inndelingen gjerne i form av såkalte paradigmer. Hvis man skal uttrykke det litt populært og praktisk, så kan man si at et paradigme er en anerkjent måte å løse et problem på. Det vil også si at det til paradigmet er et sett med spesielle metoder og teknikker. Programmeringsspråk klassifiseres gjerne innen fire hovedparadigmer: det imperative det objektorienterte det funksjonelle det logiske Det som karakteriserer språk som følger det imperative paradigme er at navngitte data manipuleres på en trinnvis måte. Programmene er på en måte en detaljert oppskrift som skal følges trinn for trinn gjør dette, gjør så deretter dette. Det gjør overgangen til maskinkode enkel fordi også datamaskiner tradisjonelt jobber på den måten. Det er det som ligger i ordet imperativ strengt kommanderende. Ulempen er at programmererne må slite med mange detaljer og med å tilpasse problemet til programmeringsspråket. Assembler er det mest ekstreme imperative språk. Andre kjente er Fortran, Pascal, Cobol, C, Ada, Basic og Algol. Flere av disse finnes i forskjellige varienter (også kalt dialekter). Det objektorienterte paradigme omfatter mer enn programmeringsspråk. Det må ses i sammenheng med objektorientert analyse og design. I objektorientert analyse prøver man å forstå et problem i form av objekter i problemdomenet, under objektorientert design bygger man opp en løsning i form av samarbeidende objekter som så kan implementeres i et objektorientert programmeringsspråk. I et objektorientert programmeringsspråk innkapsles og skjules dataene i objekter. Dette er det essensielle. Dataene kan kun manipuleres gjennom

C++ versus Java side 4 av 16 operasjoner på objektene, aldri direkte. Operasjonene er objektets interface. Objektorienterte språk er også karakterisert ved dynamisk binding mens imperative språk bare har statisk binding. Ved statisk binding blir det bestemt ved kompilering hvilken kode som skal kjøres. Dynamisk binding innebærer at det kan det utsettes til kjøretid å bestemme hvilken kode som skal kjøres. Det objektorienterte paradigme har også elementer av det imperative. Operasjoner kodes etter det imperative paradigme. For dere er Java det mest kjente objektorienterte språk. C++ er også objektorientert, men i tillegg imperativt fordi det også inkluderer C. Norske Simula var det første språk med objekter. Andre kjente objektorienterte språk er Eiffel, SmallTalk, Objective C og Delfi. De to siste er på samme måte som C++, utvidelser av eldre imperative språk (C og Pascal). Slike objektorienterte språk kalles hybride når de tillater objektorientering uten å påtvinge programmereren det paradigme. Objektorienterte purister stiller for øvrig meget strenge krav til hva som må til for at et programmeringsspråk skal kunne kalles rent objektorientert. Men det vil vi la ligge i denne sammenheng. I det imperative paradigme spesifiseres i detalj i form av algoritmer hva som skal gjøres for å løse et programmeringsproblem. Språk som følger det funksjonelle og logiske paradigme lar programmereren konsentrere seg om hvilket problem som skal løses, dvs hva som skal gjøres fremfor hvordan. Språkene sies å være deklarative. Ideen er at programmerere dermed skal bli mer produktive. I praksis kan grensen mellom imperative og deklarative språk være flytende. Ulempen med deklarative språk har hittil vært at de er vanskeligere å implementere effektivt. Det betyr at programmer i denne typen språk vil kjøre langsommere enn programmer som er skrevet i et imperativt språk. De mest kjente funksjonelle språk er antagelig Lisp, ML og Miranda. Det viktigste logiske programmeringsspråk er Prolog. 1.4.2. Strukturen i et program Setninger i et programmeringsspråk analyseres på samme måte som naturlige språk på fire nivåer: det leksikale nivå syntaktiske nivå det kontekstuelle nivå det semantiske nivå Det leksikale nivå dreier seg om ord som er tillatte i språket. De er språkets byggeklosser. I programmeringsspråk kalles disse byggeklossene leksikale symboler, leksikale enheter eller token. De leksikale symbolene klassifiseres gjerne som identifikatorer, nøkkelord, operatorer, skilletegn, literaler og kommentarer. Det syntaktiske har med regler for hvordan ord settes sammen til programmer å gjøre. Dvs det beskriver hvordan setninger i programmet bygges opp. Syntaksen beskrives gjerne i en såkalt kontekstfri grammatikk. Det vanlige er å bruke Backus Naur (BNF) formen eller Extended BNF (EBNF). Her er et lite eksempel i EBNF hentet fra [1].

C++ versus Java side 5 av 16 <program> ::= program <setning>* end <setning> ::= <tilordning> <løkke> <tilordning> ::= <identifikator> := <uttrykk>; <løkke> ::= while <uttrykk> do <setning> + done <uttrykk> ::= <verdi> <verdi> + <verdi> <verdi <= <verdi> <verdi> ::= <identifikator> <tall> Her betyr merkelappene * null eller flere forekomster og + en eller flere forekomster. representerer alternativer og uthevede ord er nøkkelord. Ord i klammeparenteser er byggeklossene. ::= betyr er definert som. Ellers finner vi tre operatorer og et skilletegn. Det er en operator for tilordning (:=), en aritmetisk (+) og en logisk (<=). Skilletegnet er ;. Her er et eksempel på et program som følger denne grammatikken. Program n := 1; while n <= 10 do n := n + 1; done end På det semantiske nivå beskrives hvordan setninger skal forstås og kommandoer utføres. Det kontekstuelle nivå som ligger mellom det syntaktiske og semantiske nivå, har regler som videre detaljerer hva som er gyldige setninger. Eksempelvis kan det i et språk være tillatt ut fra syntaktiske regler å skrive et uttrykk som dette 2 + t Man legger her sammen to verdier representert henholdsvis med et heltall og en character. Dette kan være ulovlig etter reglene på det konseptuelle nivå (konseptuell betyr å se noe i sammenheng med noe annet). Regelen kan være at det bare er tillatt å legge sammen verdier som tilhører samme type. Andre regler på det konseptuelle nivå kan være at det ikke er lov å benytte variable i uttrykk før variablene er gitt verdier. 1.5. Likheter og forskjeller Hva er så likhetene mellom C++ og Java? Man finner mange likheter fordi som vi skrev i innledningen, tok de som laget laget Java utgangspunkt i C++. På det leksikale nivå er de

C++ versus Java side 6 av 16 temmelig like. Identifikatorer som brukes til å identifisere data og objekter bygges opp på samme måte med de samme tillatte kombinasjoner av tegn. Lovlige tegn er store og små bokstaver fra det engelske alfabet, tallsiffer og spesialtegn. Konkret betyr det bokstavene A til Z og a z, sifrene 0 9 og _ (understrekningstegnet). Første tegn kan ikke være et siffer. Det skilles strengt mellom små og store bokstaver. Det er i utgangspunktet ingen begrensninger på hvor mange tegn som kan brukes, men enkelte C++ kompilatorer kan sette begrensninger på antallet signifikante tegn. I Java kan man også benytte bokstavene Æ, æ, Ø, ø, Å samt spesialtegnet $. 1.5.1. Nøkkelord og operatorer Man finner mange av de samme nøkkelord, men det er også noen som er spesielle for det ene eller andre språket. Se tabellen som følger. (Vi har også tatt med nøkkelord i C++ som begynner med understrekningstegn ( ). De er Microsoftspesifikke). Nøkkelord i Java Nøkkelord i C og C++ Kommentar abstract asm assume auto based boolean bool break break byte case case catch catch cdecl char char class class const const const_cast continue continue declspec default default delete dllexport dllimport

C++ versus Java side 7 av 16 Nøkkelord i Java Nøkkelord i C og C++ Kommentar do do double double dynamic_cast else else enum enum except explicit extends extern false fastcall final finally finally float float for for friend goto goto if if implements import inline inline instanceof int int _int8 int16 int32 int64 interface leave long long main

C++ versus Java side 8 av 16 Nøkkelord i Java Nøkkelord i C og C++ Kommentar multiple_inheritance single_inheritance virtual_inheritance mutable naked namespace native new new noreturn operator package private private protected protected public public register reinterprete_cast return return short short signed sizeof static static static_cast stdcall struct super switch switch synchronized template this this thread throw throw throws

C++ versus Java side 9 av 16 Nøkkelord i Java Nøkkelord i C og C++ Kommentar true transient try try try typedef typeid typename union unsigned using declaration eller direktiv void volatile while uuid uuidof virtual void volatile while wmain Som man legger merke til er det mange flere nøkkelord i C/C++ enn i Java. Det er også en god del nøkkelord som er Microsoft spesifikke. Operatorene er stort sett de samme. Neste tabell viser operatorene i Java og C/C++. Operatorer i Java Operatorer i C/C++ Kommentar :: rekkevidde :: global [] indeksering av tabell. kvalifisering av navn ( ) metodekall. valg av medlem (objekt) -> valg av medlem (peker)

C++ versus Java side 10 av 16 Operatorer i Java Operatorer i C/C++ Kommentar! ikke + unær pluss - unær minus ++ inkrement -- dekrement (type) casting new ++ postfiks inkrement -- postfix dekrement new delete delete[] ++ prefiks inkrement -- prefiks dekrement * dereferering & adressen til * / % + - + unær pluss - unær minus (negering)! ikke ~ bitvis komplement sizeof størrelse av objekt sizeof() størrelse av type typeid() navn av type (type) casting const_cast dynamic_cast reinterpret_cast static_cast.* peker til klassemedlem ->* dereferer peker til klassemedlem * / % + - << venstre skift >> høyre skift multiplikasjon divisjon modulus addisjon subtraksjon

C++ versus Java side 11 av 16 Operatorer i Java Operatorer i C/C++ Kommentar < <= > >= < <= > >= mindre enn mindre enn eller lik større enn større enn eller lik = =!= = =!= lik ikke lik & bitvis og ^ bitvis eksklusiv eller bitvis eller && && logisk og logisk eller = += -= %= *= /= e1?e2:e3 betinget utførelse Denne er spesiell. e1, e2 og e3 er uttrykk = += -= %= *= /= <<= >>= &= = ^=, tilordning sammensatte tilordninger venstre skift og tilordning høyre skift og tilordning bitvis og og tilordning bitvis eller og tilordning bitvis eks eller og tilord komma Som vi ser har C++ mange flere operatorer enn Java. Det er også et bidrag til at C++ er et mer komplisert språk enn Java. Ellers er det slik at det brukes de samme operatorer for aritmetikk, logikk og tilordning. Literaler (også navnløse konstanter) angis på samme måte de to språkene. Det samme gjelder kommentarer, bortsett fra at C++ ikke har /**.

C++ versus Java side 12 av 16 1.5.2. Slik er programmer bygget opp Den syntaktiske struktur er temmelig lik i programmer skrevet i Java og C++. Det samme kan vi si om det kontekstuelle og semantiske nivå. La oss se på noen programeksempler. Java class Omregning { public static void main(string [] args) { final double faktor = 4.2; double antallkalorier = 500; double antalljoule = antallkalorier * faktor; System.out.println( "Antall kj blir " + antalljoule); } } C/C++ #include <stdio.h> const double faktor = 4.2; void main(int argc, char* argv[]) { double antallkalorier = 500; double antalljoule = antallkalorier * faktor; printf( "Antall kj blir %4.2f", antalljoule); } Her er det som man ser ganske likt når det gjelder oppbygningen av programmene. Man her de samme datatypene, de samme operatørene, de samme skilletegn, den samme oppbygging i blokker mellom krøllparenteser { }. Navngivningen skjer på samme måte. Noen vesentlige forskjeller er det likevel. I Java må alt skje i objekter. Dvs at et program må definere minst en klasse. Klassen må ha samme navn som kildekodefilen. Denne klassen (Omregning i dette eksemplet) må ha en operasjon (metode i Java) som heter main og som er static. Metoden har en tabell av type String som argument. I C/C++ programmer er det funksjonen main som er en slags ramme rundt programmet. Alle programmer starter eksekvering med denne funksjonen. Utskrift håndteres i Java gjennom objekter. I C++ er det flere muligheter. I dette eksemplet bruker vi C måten. (Andre måter som er mer objektorienterte skal vi ta for oss etter hvert). Programmet kan med andre ord gjerne gå for å være skrevet i C. Det er nemlig slik at i C kan main() returnere void (eller ingenting), mens i C++ programmer krever standarden at må main() returnere en int. (Ikke alle C++ kompilatorer er like nøye med dette). I dette eksemplet skjer utskrift ved kall til en biblioteksfunksjon, printf. Prototypen til funksjonen ligger i filen stdio.h. En prototype er det samme som signaturen til en metode. Kompilatoren må kjenne til denne for å gjøre jobben med å kompilere riktig. Vi forteller kompilatoren hvor den kan finne prototypen med kompilatordirektivet #include. Dette sier at kompilatoren skal inkludere filen med det angitte navn, i dette tilfellet stdio.h. At filnavnet står mellom klammeparenteser, sier at filen finnes i en standard katalog for biblioteker. Det finnes flere kompilatordirektiver. Alle begynner med #. Dette med å dele programmer opp i filer med spesielle etternavn (.h i dette eksemplet) er vanlig i C og C++. Dette skal vi se nærmere på i senere leksjoner. I C++ har funksjonen main to argumenter. Et er et heltall, mens det andre er en tabell med pekere til char. (Det er slik tekststrenger håndteres. Mer om det senere). I Java håndteres tekst i klassen String. Derfor er det bare et argument i metoden main der. Begge programmene viser typisk kode for programmer skrevet i et imperativt programmeringsspråk. Verken programmet skrevet i Java eller det som er skrevet i C++ er særlig objektorienterte. C++-programmet er det definitivt ikke. Java-programmet har bare en

C++ versus Java side 13 av 16 klasse som for så vidt ikke har annet formål enn å innkapsle et ellers imperativt program. Det betyr at man i Java heller ikke trenger å skrive spesielt objektorienterte programmer. (Det er en av grunnene til at purister ikke anser Java for å være et rent objektorientert språk). Her følger en variant av C++-programmet. #include <iostream> const double faktor = 4.2; int main(int argc, char* argv[]) { } double antallkalorier = 500; double antalljoule = antallkalorier * faktor; std::cout << "Antall kj blir " << antalljoule; return 0; Forskjellen er utskriften og retur fra main(). Her vises C++ måten å gjøre det på. Man sender utskriften til en standard utenheten representert ved klassen cout. Den finner vi i biblioteket iostream og ettersom cout tilhører namespace std, må den kvalifiseres med std::cout. namespac er nytt i C++. Vi kommer tilbake til flere detaljer rundt dette i en senere leksjon. Den våkne leser la kanskje merke til at i tabellen over operatorer så betyr operatoren << venstre skift. Men i dette eksemplet betyr den dirigering av utskrift. Altså er det i C++ slik at det er sammenhengen en operator brukes i som bestemmer hva den står for. Vi har med regler på det kontekstuelle nivå å gjøre. I C++ er det mulig også for programmererne å omdefinere operatorer slik at de gjør spesielle ting i spesielle sammenhenger. Det kalles operator overloading. En mekanisme som gjør C++ fleksibelt, men også mer komplisert. Mer om det senere. 1.5.3. Datatyper Java og C++ har stort sett de samme datatyper. Naturlig nok er det også noen forskjeller. Se tabellen som følger her. Her har vi listet datatypene i C++ og der hvor det finnes tilsvarende i Java er det kommentert. C++ har tre kategorier datatyper. Det er fundamentale (fundamental), avledede (derived) og klasse (class).

C++ versus Java side 14 av 16 Kategori Type Innhold Tilsvarende Java Fundamental char En type som char, størrelse 2 signed char vanligvis inneholder byte et tegnsett. I unsigned char Microsoft C++ er det ASCII. Størrelse i MS C++ 1 byte. short short int unsigned short signed short int signed int unsigned int intn long long int unsigned long float double En type som har en størrelse lik eller større enn char og mindre eller lik størrelsen til int. Størrelse i MS C++ 2 byte. Heltall med fortegn. Størrelse større eller lik short int og mindre eller lik størrelsen til long. Størrelse i MS C++ 4 byte. En int hvor størrelsen i bit er lik n. Verdien på n kan være 8, 16, 32, 64. Et heltall hvor størrelsen er lik eller større enn størrelsen til int. Størrelse MS C++ 4 byte float er den minste type flyttall. Størrelse i MS C++ 4 byte. En flyttallstype som er større enn elle lik float. Størrelse i MS C++ 8 byte short, størrelse 2 byte int, størrelse 4 byte long, størrelse 8 byte float, størrelse 4 byte double, størrelse 8 byte

C++ versus Java side 15 av 16 Kategori Type Innhold Tilsvarende Java long double long double og double er like i størrelse, men betraktes som forskjellige typer. Størrelse i MS C++ 8 byte. Direkte avledede typer er typer som er direkte avledet av eksisterende typer Sammensatte avledede typer (composed derivatived types) Tabeller (arrays) Funksjoner Pekere Referanser til objekter Konstanter Pekere til klassemedlemmer class struct union Funksjoner er datatype. Samme som litteral Samling av data og funsjoner. Innhold default private. Samme som class, men innhold public ved default Type som kan inneholde forskjellige variable i samme minneområde. Samme type class Finnes ikke. Finnes ikke. I C++ kan man deklarere egne typer med nøkkelordet enum. Enum er forkortelse for enumeration på engelsk. Det oversettes til norsk med oppramsing. En enumerated type er en brukerdefinert type som består av et sett med navngitte konstanter. Ved default har første enumerator verdien 0 og hver etterfølgende verdi en større enn foregående. Men dette kan

C++ versus Java side 16 av 16 endres eksplisitt. En enum kan gjøres om til heltall. I de første versjonene av Java var enum ikke med. Nå er den det 1. Eksempel enum Dager { lordag, sondag = 0, // Erklærer enum type Dager // lørdag = 0 ved default // søndag = 0 likedan mandag, // mandag = 1 tirsdag, // torsdag = 2 onsdag, torsdag, fredag // etc. } idag; // Variabel idag har type Dager int tirsdag; // Error, redefinisjon av tirsdag enum Dager igår; Dager imorgen; // Lovlig i C og C++ // Lovlig bare i C++ Vi kommer etter hvert til å se bruk av de fleste datatyper i C++ gjennom dette kurset. 1.6. Litteratur 1. Bal & Grune, Programming Language Essensial, Addison-Wesley 1994, ISBN 0-201-63179-2 1 Det er også andre ting i C/C++ som ikke var med i Java til å begynne med, men som etter hvert har kommet til. Man må altså stadig holde seg oppdatert. En annen kommentar er at det Javautviklerne mente var uheldige ting i C/C++ nå har blitt akseptert som nyttig. Templates er også kommet med. Det betegnes som generics i Java.