
Koşul, programın bir yolda vereceği kararı belirler. Bunun için if / else kullanırız. Mesela:
#include <iostream>
int main() {
const int yas{21};
if (yas >= 18) {
std::cout << "yetiskin\n";
} else {
std::cout << "kucuk\n";
}
return 0;
}burada if in yanında () içine bir koşul yazarız. Bu koşul sağlanırsa {} içindeki kodlar çalışır, sağlanmazsa else varsa orası çalışır.
yas 18'den büyük veya eşitse yetiskin, değilse kucuk yazdırılır.
>= gibi operatörler listesi aşağıdaki gibidir.
| Operatör | Adı | Örnek (a 5, b 3) | Sonuç |
|---|---|---|---|
== | eşit mi | a == b | false |
!= | eşit değil mi | a != b | true |
> | büyük mü | a > b | true |
< | küçük mü | a < b | false |
>= | büyük veya eşit mi | a >= b | true |
<= | küçük veya eşit mi | a <= b | false |
Bunların hepsi bir bool üretir: true veya false. if de tam olarak bu kullanılır. yas >= 18 ya doğrudur ya değildir; ikisi birden olmaz.
Altıncı derste atamanın bir ifade olduğunu söylemiştik. = değeri atar, == ise eşitliği sorgular. Karışırsa program “eşit mi” diye bakmaz, doğrudan 5 yazar:
int x{0};
if (x = 5) { // x'i 5 yapar, sonra 5'e bakar (true). karşılaştırma değil
std::cout << "girdi\n";
}
if (x == 5) { // gerçekten 5 mi diye sorar
std::cout << "esit\n";
}if (x = 5) yazınca çoğu derleyici uyarır (-Wall bunu bildirir). Uyarıyı “nasıl olsa çalışıyor” diye atlamadan okuyabilirsin. Eşitlik sorusu her zaman == dır.
Neden bunu anlattım?
Çünkü mesela, matematikteki 3 < x < 10 C++'ta “x hem 3'ten büyük hem 10'dan küçük” demez. 3 < x bir bool üretir, onu 10 ile karşılaştırmaya kalkar. İki karşılaştırmayı && ile bağlarız, birazdan geleceğiz.
if, else, else if
Tek durumda if yeter. İki durumda if / else. Üç veya daha fazla durum varsa else if zinciri:
#include <iostream>
int main() {
int notu{75};
if (notu >= 90) {
std::cout << "A\n";
} else if (notu >= 70) {
std::cout << "B\n";
} else if (notu >= 50) {
std::cout << "C\n";
} else {
std::cout << "kaldi\n";
}
return 0;
}Yukarıdan aşağı sırayla kontrol edilir. İlk sağlanan kısım çalışır, gerisine bakılmaz. notu 75 olduğu için A'ya girmez, B'ye girer, C'yi kontrol bile etmez.
Süslü parantezi tek satırda da olsan koyman gerek. Çünkü böyle de yazabilirsin if (x == 1) std::cout << "a"; sonra bir satır daha eklersin, o satır koşulun dışında kalır, saatlerce ararsın. O yüzden yazabiliyor olman yazman gerektiği anlamına gelmez. Seride {} alışkanlığı burada da geçerli.
if içine if de yazılır else if kullanımı yerine mantıken.Ancak okunması zorlaşır. İki üç dal varsa önceliğin else if dalları kurmak olsun. İç içe if yazdıysan her else'in hangi if'e ait olduğu süslü parantezle belli olsun.
Mantıksal operatörler
Birden fazla soruyu tek koşulda birleştirmek için üç tane operatör vardır:
| Operatör | Adı | Ne zaman true |
|---|---|---|
&& | ve | iki taraf da true |
|| | veya | en az bir taraf true |
! | değil | true'yu false, false'u true yapar |
#include <iostream>
int main() {
const int yas{21};
const bool ogrenci{true};
if (yas >= 18 && ogrenci) {
std::cout << "indirimli\n";
}
if (yas < 18 || ogrenci) {
std::cout << "kampanya\n";
}
if (!ogrenci) {
std::cout << "tam fiyat\n";
}
return 0;
}&& solda false değeri alındıysa ise sağı hiç çalıştırmaz. || solda true değeri varsa sağı çalıştırmaz. Buna kısa devre denir. Mesela b != 0 && a / b > 2 yazınca b 0 iken bölmeye hiç girilmez; tanımsız davranışa (sıfıra bölme) yol açmaz. Kısa devre olmasa a / b yine hesaplanırdı.
! tek operand alır (altıncı dersteki -sayi gibi). Sonuncu if koşulunda ise if (!hazir) “hazır değilse” demektir.
Parantezi bolca kullanabilirsin. a || b && c koşulunda && önceliği c++ daha önemlidir. Yani önce b && c değerlendirilir, ardından sonucu a ile || üzerinden birleştirilir. Eğer tam olarak onu istiyorsan bile ne kastettiğini a || (b && c) diye yaz ki sırayı ezberlemek zorunda hissetme. Tam tersini yapmak istersin ancak parantez koymazsın yanlış hatırladığın için. Sıkıntı çıkabilir.
Koşulu değişkende sunmak
const bool yetiskin{yas >= 18};
if (yetiskin) {
std::cout << "yetiskin\n";
}if (yetiskin == true) yazmana gerek yok. yetiskin zaten bool dur. == true boşa görüntü kirliliği. Yani (yetiskin) zaten true ve false döndürür.
const bool yetiskin{yas >= 18}; bu ise başka yerde tanımlı yas değişkeni 18'den büyük veya eşitse yetiskin bool değişkenini true yapar aksi halde false.
if içinde tanım
Üçüncü derste dar kapsamdan söz etmiştik: isim yalnızca kullanıldığı blokta yaşarsa kapsam daralır. Modern C++ için o değişkeni ifin () içine de koyabilirsin. Dışarı sızmaz. :
#include <iostream>
int main() {
if (const int yas{21}; yas >= 18) {
std::cout << "yetiskin\n";
} else {
std::cout << "kucuk, yas: " << yas << '\n';
}
// yas burada yok
return 0;
};den önceki kısım tanım, sonraki kısım koşul. else içinde yas hâlâ görünür; if tamamen bitince yas tamamen ölür.
switch
if / else if ile tam sayıları tek tek == ile kontrol etmek her şeyi uzatoır. switch dediğimizz şey verilem değere göre dallar çıkartır:
#include <iostream>
int main() {
int gun{3};
switch (gun) {
case 1:
std::cout << "pazartesi\n";
break;
case 2:
std::cout << "sali\n";
break;
case 3:
std::cout << "carsamba\n";
break;
default:
std::cout << "bilinmiyor\n";
break;
}
return 0;
}case yanına sabit ifade yazılır (beşinci ders: derleyicinin şimdiden bildiği tamsayı). gun == 3 olduğu için carsamba basılır.
break o dalı bitirir. Yazmazsan alttaki diğer case lere geçer: 3'ü yazmayı unutursan carsamba ve bilinmiyor hatası art arda çıkar. break kullanmamak hatadır.
default hiçbir case değeri karşılanmazsa çalışır. Koymak zorunda değilsin; tutmayan değer sessizce o case ı atlatır. Yani switch içindeki hiç bir case çalışmasa bile sorun yok. Bilinmeyen değeri almak istemiyorsan default koy.
switch; int, char, enum gibi tamsayı türlerinde çalışır. std::string ile switch yapılmaz; orada if / else if kullanılır.
İleride enum class diye bişeler göreceğiz. Yon::sol gibi isimler doğrudan 1 2 yerine geçicek, switch in o zaman daha okunur olacağını görürsünüz. Şimdilik tamsayı diye bilin.
Alıştırma
Kullanıcıdan bir int not u al (std::cin). 90 ve üzeri A, 70 ve üzeri B, 50 ve üzeri C, altındakiler kaldı şeklinde çıktı ürettir. {} ile başlat. if (notu = 90) yazmayı dene, derleyicinin ne dediğine bak, == ile düzelt.



