Hello, World!

Lad os allerførst se på et programs anatomy. Med refference til Python ved vi, at vi skriver “Hello, World!” med følgende kode: print(“Hello, World!”)

Helt så enkelt er det ikke med C++.

Der findes faktisk flere måder at skrive “Hello, World!” på i C++.

Jeg vil her skrive den måde, som jeg selv bruger. Der findes hverken noget rigtigt eller forkert. Når alt kommer til alt handler det om, at skrive en kode som fungerer og som gerne er enkel at forstå.

Arbejder du på et projekt sammen med andre, er det dog en god idé, at have aftalt, på forhånd, hvordan ens syntaks skal være.

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello, World!";
    return 0;
}

Lad os tage den fra en ende af:

; Vi slutter altid linjer med expressions og declaration statements af med et semikolon. De er grundlag for en del bugs i starten, når vi eksperimenterer med C++.

#include <iostream> er vores preprocesor. Den bruger vi når vi skal kunne skrive et input og et output. Dette kalder vi også for at streame et input og et output. input og output-funktionerne findes ikke i vores program, medmindre at vi kalder på iostream-biblioteket.

Du har måske set <iostream> blive skrevet <iostream.h> eller måske ligefrem “iostream.h” i nogle programmer på nettet. h’et betyder i øvrigt at det er en header(det kommer vi til senere, men ikke i dette kapitel). Jeg vælger at skrive mine eksempler med <> og ikke med <.h>.

using namespace std; Uden at gå for meget i detaljer benytter vi her namespace hvilken i bund og grund gør det nemmere at skrive vores kode. Namespace sparer os for at opfinde det runde hjul igen og igen. Her letter det vores programmering med, at vi ikke skal skrive std foran cout. Havde vi ikke skrevet using namespace std; ville vi i stedet skulle skrive std::cout << “Hello, World!”;

int main() er vores funktion, som skriver vores program.

{ } disse velkendte tegn i C++, udtaler jeg selv curly brackets, men du vil sikkert også høre nogle kalde dem for tuborg-klammer og meget andet. Det er helt ligemeget, hvad vi kalder dem. De bruges til flere formål, men overordnet kan du se dem som starten { og slutningen } på en kodeblok, der gør noget bestemt i programmet.

cout << “Hello, World!”; udtales c out, og er programmets standard output stream. Dens output er her strengen “Hello, World!”. Og fordi vi bruger namespace, skal vi ikke skrive std::cout << “Hello, World!”;

return 0; Returnerer integer 0. Faktisk er det ikke nødvendigt at skrive return 0. Men jeg gør det. Måske af gammel vane. Du behøver ikke.

Geany har compileret vores program.

Som du kan se er det ikke så lige til at lave et program i C++ som i Python. Og der er en masse måder man kan gøre sine ting på – det er også det som er fedt ved C++.

Andre måder at gøre det på

Lad os lige se på, hvad vi også kunne have gjort. Man kan nemlig skrive “Hello, World!” på flere måder i C++. Her vil jeg vise et eksempel, hvor jeg undlader at bruge namespace.

#include <iostream>

int main()
{
    std::cout << "Hello, World!";
    return 0;
}

Det ovenstående eksempel er et godt eksempel på, hvordan vi også kan skrive “Hello, World!”. Det vigtige at tage med fra dette eksempel er at vi har undladt at bruge namespace(using namespace std;), hvorfor vi må skrive std::cout inde i main funktionen. Og det er altså lidt besværligt, hvis vi skal skrive en masse kode.

Alternativt kunne man skrive using std cout; og og using std endl; Dermed bliver man mere specifik i sin kode.

#include <iostream>

using std cout;
using std endl;

int main()
{
   cout << "Hello, World!" << endl;

   return 0;
}

Competitive programming har for alvor manifesteret sig. Groft sagt handler det om at dyste i programmering og se, hvem der opnår de bedste og hurtigste resultater i at finde løsninger. Derfor er algoritmer og behandling af datastrukturer meget ofte benyttede. C++ er et meget brugt programmeringssprog inden for competitive programming, da standard biblioteket kommer med nogle præ-definerede algoritmer, der er hamrende hurtige.

Til konkurrencer kunne man fx skrive:

#include <iostream>
#include <algorithm>
#include <vector>

Men da competitive programming handler om at bygge sit program hurtigst muligt op, så vi kan nå et resultat før de andre, nytter det ikke noget at rode rundt med at indhente biblioteker. Derimod kan vi indhente dem alle sammen ved følgende #include <bits/stdc++-h>.

#include <bits/stdc++.h>

using namespace std;

int main()
{
    cout << "Hello, World!";
    return 0;
}

Jeg anbefaler ikke at man benytter ovenstående eksempel, hvor #include <bits/stdc++-h> indgår. I starten er det vigtigste at man ved, hvornår man skal bruge vector og algorithm. Henter man bare bibliotekerne, blindt, opnår man kke den store forståelse af dem.

New line

\n

Vi kender en newline fra python. Vi lavede dem ved hjælp af en escape character(\n) hvor Python ikke printer \n men i stedet læser, at den skal lave en ny linje. Fx: print(“Hello, World!\n”). Det samme kan vi gøre i C++. Fx: cout << “Hello World!\n”; ville lave en ny linje og kun printe “Hello World” ud. \n ville compileren læse som en escape character, der siger vi skal have en ny linje.

Du vil også se nogle bruge cout << “Hello, World!” << “\n”; Denne kode er længere og mindre enkelt opbygget, så jeg ville ikke selv gøre dette.

endl;

Så har vi endl; hvilket deler vandene lidt. endl står for end line. Den gør præcis det samme som vores escape character \n, men alligevel kan det være relevant at være opmærksom på, at endl faktisk gør programmet tungere og altså får det til at kører langsommere.

Nogle foretrækker: cout << “Hello, World!” << endl; Det er ikke forkert. Jeg gør det selv af og til. Men teknisk set kører et program hurtigere med en escape character(\n).

cstdio vs iostream

Men hey! Hvad med cstdio? Den bruger mange jo i bøgerne og mange teoretikerer har også genfundet glæden ved cstdio.

Du har måske ligefrem hørt, at iostream er langsomt og får vores programmer til at crashe, og at cstdio er langt hurtigere og mere robust. Tolker man alene den assembly kode der kommunikerer med vores computer fra sourcekoden, ser en printf godt hurtigere ud, da den ikke fylder lige så mange linjer som cout gør = den eksekverer programmet hurtigere. Men det betyder virkelig ingenting i 2020. I hvert fald ikke når vi starter på C++.

Mit råd er derfor at skrive cout i stedet for printf, da cout og iostream er lavet til C++ mens printf og cstdio er for C.