Den enklaste former av flödeskontroll i C++ är en if-sats. Denna kontrollerar
att villkor och om detta evalueras till true utförs
if-satsens kropp, i annat fall ignoreras kroppen. Den allmänna formen ser ut
så här:
Även
if-satser bör använda sig av kodblock för att undvika misstag. Ett
exempel som kontrollerar om ett tal har ett visst värde kan se ut så här:
// ge en variabel Tal ett värde
int Tal;
cin >> Tal;
if ( Tal == 27 ) {
// talet var 27
cout << "Talet var 27!\n";
} |
I C++ används inte nyckelordet
then eller dylikt såsom i
t.ex. Modula-2. Exemplet ovan sktiver ut
Talet var 27! om
Tal har värdet 27.
if-satser är den mest använda konstruktionen för att styra ett programs flöde
i C++. Så gott som alla program använder sig av if-satser. Man bör dock vara
noggrann med att man faktiskt skriver == då man avser att göra en
jämförelse. Vad händer om man istället hade skrivit:
Beroende på kompilatorn som används är detta helt korrekt C++ och inte ens en varning ges. Här har
ett
= fallit bort. Kvar blir då en tilldelning! Det som händer är att
Tal tilldelas värdet 27 och
Tal evalueras då till
true ftersom det inte är 0, och
if-satsens kropp
kommer att utföras. Kanske inte direkt önskat resultat. Detta är ett vanligt fel, och kan vara svårt
att hitta.
Då man hanterar if-satser är det speciellt viktigt att tänka på att använda
block runt if-satsen kropp. Speciellt om man avser att ha fler än en enda
sats som kropp. Exemplet nedan fungerar inte som man kunde tro
// läs ett menyval från tangentbordet
char Menyval;
cin >> Menyval;
if ( Menyval == 's' )
// spara någonting till fil
cout << "Sparar data till fil." << endl;
spara (); |
Enligt indenteringen ovan så skulle funktionen
spara() (mera om funktioner i
Kapitel 7) utföras endast då menyvalet är ett
s, men så är
inte fallet. Endast raden med
cout tillhör
if-satsens
kropp, raden med
spara() kommer efter hela
if-satsen
och utförs således alltid. Kanske inte önskat beteende. Problemet åtgärdas genom att kapsla in
kroppen mellan
{ och
}:
// läs ett menyval från tangentbordet
char Menyval;
cin >> Menyval;
if ( Menyval == 's' ) {
// spara någonting till fil
cout << "Sparar data till fil." << endl;
spara ();
} |
Att använda block är något som är bra att göra till en vana. Koden blir minimalt längre, men antalet
onödiga logiska fel minskar.
Det är fullt möjligt att nästla if-satser innanför varandra om det skulle
behövas, precis som i andra programmeringsspråk. Detta kan se ut som nedan där ett tal först
kontrolleras om det är jämnt, och sedan om det är delbart med 4 eller 6.
// ge en variabel Tal ett värde
int Tal;
cin >> Tal;
if ( Tal % 2 == 0 ) {
// talet var jämnt, d.v.s. delbart med 2, är det delbart med 4?
if ( Tal % 4 == 0 ) {
// talet var delbart med 4
cout << "Talet " << Tal << " är delbart med 4\n";
}
// är det delbart med 6?
if ( Tal % 6 == 0 ) {
// talet var delbart med 6
cout << "Talet " << Tal << " är delbart med 6\n";
}
} |