Instrukcja warunkowa (ang. conditional statement) występuje w dwóch postaciach.
Prostsza to
if ( b ) instrgdzie b jest wyrażeniem o wartości logicznej, a instr jest instrukcją. Pamiętamy przy tym, o czym już mówiliśmy, że w C/C++ również liczbowe wartości całkowite i wskaźnikowe mogą być trakowane jako wartości logiczne — cokolwiek różnego od zera jest traktowane jako true, a wartość zerowa jako false. Opracowanie instrukcji warunkowej w tej formie polega na obliczeniu wartości b a następnie:
if ( s != 0 )
cerr << "Cos nie w porzadku! Konczymy." << endl;
exit(1);
spowoduje zawsze zakończenie programu, bo instrukcja
exit nie jest wcale „pod ifem”!
Powinniśmy raczej napisać
if ( s != 0 ) {
cerr << "Cos nie w porzadku! Konczymy." << endl;
exit(1);
}
Innym często popełnianym błędem jest stawianie średnika zaraz za zamknięciem nawiasu okrągłego w instrukcji warunkowej
if ( s != 0 );
{
cerr << "Cos nie w porzadku! Konczymy." << endl;
exit(1);
}
Zauważmy, że kompilacja powyższego fragmentu powiedzie się.
Po
if (...) jest tu instrukcja, zgodnie ze
składnią — jest nią mianowicie instrukcja pusta (średnik).
Natomiast instrukcja grupująca, która po niej występuje, nie
jest już „pod ifem” i wykona się zawsze, niezależnie od
prawdziwości warunku '
s != 0'.
Inna pułapka związana jest z faktem, że w C/C++, jak mówiliśmy w rozdziale o typie logicznym , wartość całkowita jest traktowana jak wartość logiczna: false odpowiada wartości zerowej, true każdej innej. Powoduje to niestety częste błędy (które w Javie zostałyby wychwycone przez kompilator). Na przykład, jeśli a i b są zmiennymi całkowitymi, to wartością przypisania ' a=b' jest, zgodnie z zasadą obowiązującą zresztą i w Javie, wartość lewej strony po przypisaniu, czyli wartość a. I to ona zostanie zinterpretowana jako wartość logiczna wyrażenia ' a=b' w instrukcji
if ( a = b ) instr // prawdopodobnie źle !!choć zwykle intencją programisty było raczej porównanie: sprawdzenie, czy wartość a jest czy nie jest równa wartości b.
Druga forma instrukcji warunkowej to
if ( b ) instr1
else instr2
gdzie, jak poprzednio,
b
jest wyrażeniem o wartości
logicznej a
instr1
i
instr2
są
instrukcjami — prostymi lub złożonymi. Opracowanie instrukcji
warunkowej w tej formie polega na obliczeniu wartości
b,
a następnie:
Każda z instrukcji instr1 i instr2 może z kolei też być instrukcją warunkową. Obowiązuje przy tym zasada, że frazie else odpowiada zawsze najbliższa poprzedzająca ją fraza if, po której nie było jeszcze frazy else i która jest zawarta w tym samym bloku na tym samym poziomie zagnieżdżenia co ta fraza else. Na przykład
if ( b1 ) instr0 else if ( b2 ) instr1 if ( b3 ) instr2
else instr3 else instr4
jest równoważne
if ( b1 ) // 1
instr0
else // 1
if ( b2 ) { // 2
instr1
if ( b3 ) // 3
instr2
else // 3
instr3
}
else // 2
instr4
gdzie tymi samymi liczbami w komentarzach oznaczone
są odpowiadające sobie frazy
if
i
else.
Inny przykład:
1. if ( val >= 0 )
2. {
3. if ( val > 9 ) cout << "Za duzo" << endl;
4. }
5. else
6. cout << "Za malo!" << endl;
Zauważmy, że w powyższym przykładzie konieczne było ujęcie
instrukcji z linii trzeciej w blok, mimo że jest to jedyna instrukcja
„pod ifem” z linii pierwszej. Gdybyśmy tego nie uczynili,
fraza
else
z linii 5 zostałaby zinterpretowana jako para
do frazy
if
z linii 3, a nie do
if
z linii pierwszej!
T.R. Werner, 21 lutego 2016; 20:17