- if(warunek)
- {
- //....
- }
- else if(warunek)
- {
- //...
- }
- else
- {
- //...
- }
Działanie jest bardzo proste. Jeśli warunek wpisany w nawiasie jest prawdziwy, wtedy zostaje wykonany kod zdeklarowany w danej jej części. Jeśli natomiast warunek nie jest spełniony, to następuje sprawdzenie kolejnego. Natomiast jeśli żaden z nich nie jest prawdziwy to wykonywana jest część opisana po słowie else, jeśli oczywiście została ona zdeklarowana.
Poniżej przedstawię kilka przykładowych programów pozwalających na łatwe zrozumienie tego zagadnienia.
W pierwszym programie sprawdzana jest wartość zmiennej, jeśli jest ona prawdziwa to zostanie wypisany tekst na ekranie.
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int zmienna = 5;
- if(zmienna == 5)
- {
- printf("Warunek prawdziwy");
- }
- return 0;
- }
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int zmienna = 2;
- if(zmienna == 5)
- {
- printf("Warunek prawdziwy");
- }
- else if(zmienna == 3)
- {
- printf("Drugi warunek");
- }
- else
- {
- printf("Inna wartosc");
- }
- return 0;
- }
Poszczególne instrukcje można także zagnieżdżać, przez co będzie sprawdzanie kilka warunków.
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int zmienna = 1;
- int pomocnicza = 10;
- if(zmienna > 0)
- {
- if((zmienna == 12-pomocnicza) && (zmienna <= 4))
- {
- printf("Warunek prawdziwy");
- }
- else
- {
- printf("Warunek bledny");
- }
- }
- else if(zmienna < 0)
- {
- if(zmienna <= -13 && zmienna >= -43)
- {
- printf("Drugi warunek");
- }
- else
- {
- printf("Znowu zle");
- }
- }
- else
- {
- printf("Inna wartosc");
- }
- return 0;
- }
Tak samo sytuacja wygląda z innymi typami zmiennych jak char, boolean, long, float, double itp.
Należy także pamiętać, że w przypadku wejścia do któregoś z warunków, żaden następny nie będzie sprawdzany.
Można to zaobserwować na następującym przykładzie. Gdzie warunek będzie sprawdzany w osobnej funkcji:
- int CheckValue(int var, int ref)
- {
- printf("Spradzam warunek dla %d\r\n", ref);
- if(var == ref)
- {
- return 1;
- }
- return 0;
- }
- int main()
- {
- int zmienna = 3;
- if(CheckValue(zmienna, 1) == 1)
- {
- printf("if..\r\n");
- }
- else if(CheckValue(zmienna, 3) == 1)
- {
- printf("else if 1..\r\n");
- }
- else if(CheckValue(zmienna, 5) == 1)
- {
- printf("else if 2..\r\n");
- }
- else
- {
- printf("else..\r\n");
- }
- return 0;
- }
Po wywołaniu funkcji zostanie zwrócona następująca informacja:
- Spradzam warunek dla 1
- Spradzam warunek dla 3
- else if 1..
Czyli sprawdzone zostały pierwsze dwa warunki ponieważ, druga instrukcja była poprawna.
Kolejnym elementem o jakim należy pamiętać to wywoływanie kilku warunków z jednej instrukcji. Ma to głównie znaczenie kiedy w instrukcji wywoływana jest jakaś zmiana. Czyli oprócz sprawdzenia warunku ustawiamy jakieś parametry (czego oczywiście nie powinno się robić). Wprowadzę małą zmianę w powyższym programie:
- #include <stdio.h>
- int CheckValue(int var, int ref)
- {
- printf("Spradzam warunek dla %d\r\n", ref);
- if(var == ref)
- {
- return 1;
- }
- return 0;
- }
- int main()
- {
- int zmienna = 3;
- if((CheckValue(zmienna, 1) == 1) && (CheckValue(zmienna, 5) == 1))
- {
- printf("if..\r\n");
- }
- else if(CheckValue(zmienna, 3) == 1 && (CheckValue(zmienna, 4) == 1))
- {
- printf("else if 1..\r\n");
- }
- else if(CheckValue(zmienna, 5) == 1)
- {
- printf("else if 2..\r\n");
- }
- else
- {
- printf("else..\r\n");
- }
- return 0;
- }
W odpowiedzi dostaję:
- Spradzam warunek dla 1
- Spradzam warunek dla 3
- Spradzam warunek dla 4
- Spradzam warunek dla 5
- else..
Jak widać warunków do sprawdzenia do wejścia do instrukcji else było 5, natomiast zostały sprawdzone tylko 4. Stało się tak ponieważ w pierwszej instrukcji if, po sprawdzeniu pierwszego warunku, który był nieprawdziwy nie było sensu sprawdzać drugiego. Zastosowano tam operator &&, dla którego oba warunki muszą być poprawne, by całe wyrażenie było prawdziwe.
Podobnie wygląda sytuacja z operatorem ||. W takim przypadku sprawdzony będzie drugi warunek tylko gdy pierwszy okaże się nieprawdziwy.
Należy także pamiętać o stosowaniu nawiasów klamrowych. Oprócz poprawy czytelności kodu, pozwala na obrazowe stwierdzenie która część kodu ma się wykonać w instrukcji. Jeśli go zabraknie tylko jedna linia po instrukcja zostanie wykonana dla spełnionego warunku. Reszta będzie się wykonywać za każdym razem.
- int main()
- {
- int zmienna = 3;
- if(zmienna == 3)
- printf("w intruckji if\r\n");;
- if(zmienna == 5)
- printf("w intruckji if2\r\n");
- printf("za intruckja if2\r\n");
- return 0;
- }
W przypadku konstrukcji zawierającej dodatkowe warunki else if, taka operacja się nie uda. Ponieważ zostanie zgłoszony błąd kompilacji. Przez brak nawiasów klamrowych, kompilator nie widzi, w którym miejscu instrukcja if się zaczyna. Taki problem nie wystąpi gdy każdy z instrukcji będzie zawierał tylko jedną operację.
- #include <stdio.h>
- int main()
- {
- int zmienna = 3;
- if(zmienna == 3)
- printf("w intruckji if\r\n");
- else if(zmienna == 7)
- printf("w intruckji zz\r\n");
- else if(zmienna == 5)
- printf("w intruckji if2\r\n");
- printf("za intruckja if2\r\n");
- return 0;
- }
Warto zwracać także uwagę na sprawdzanie zmiennej operatorem ==. Bardzo łatwo wprowadzić następujący błąd do kodu:
- if(zmienna = 3) {
- printf("w intruckji if\r\n");
- }
Dla takiego wyrażenia warunek będzie zawsze spełniony, ponieważ do zmiennej jest przypisana wartość. Kompilator może to zauważy i zwróci ostrzeżenie (warning), ale nie każdy. Można się przed tym uchronić wykonując sprawdzenie warunku w następujący sposób:
- if(3 = zmienna) {
- printf("w intruckji if\r\n");
- }
Spowoduje to wywołanie błędu podczas kompilacji. Ponieważ do wartości stałej zostaje przypisana wartość zmiennej:
- main.c:25:10: error: lvalue required as left operand of assignment
- 25 | if(3 = zmienna) {
- | ^