Menu

C'de if else: Söz Dizimi, Örnekler ve Sık Yapılan Hatalar

C nasıl karar verir: if deyimi, else, else if zincirleri, iç içe yerleştirme ve üçlü operatör - ayrıca doğruluk kuralı (0 yanlıştır, geri kalan her şey doğrudur) ve koşulları sessizce bozan = ile == hatası.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Programların Neden Dallara İhtiyacı Var

Şimdiye kadarki her program doğrudan akıp gitti: 1. satır, 2. satır, 3. satır. Gerçek programlar karar verir. Parola doğru mu? Sayı negatif mi? Dosya açıldı mı? if deyimi, C'nin bir soru sorup kodu yalnızca cevap evet olduğunda çalıştırma yoludur.

temperature > 30 koşulu bir kez test edilir. Geçerlidir, dolayısıyla mesaj yazdırılır. Son satır süslü parantezlerin dışındadır, dolayısıyla ne olursa olsun yazdırılır. 31'i 18 yapıp tekrar çalıştırın - ilk mesaj yok olur, ikincisi kalır.

Söz Dizimi: Parantezler, Süslü Parantezler ve Noktalı Virgül Yok

C'de bir if'in sabit bir biçimi vardır:

if (kosul) {
    // koşul sıfırdan farklı olduğunda çalışır
}

Erken ezberlenmeye değer üç kural. Koşul etrafındaki parantezler zorunludur. then anahtar kelimesi yoktur. Ve kapanış parantezinden sonra noktalı virgül yoktur - başıboş bir tanesi deyimi tam orada bitirir:

// HATA: if hiçbir şey yapmaz; printf her zaman çalışır
if (x > 10);
{
    printf("buyuk\n");
}

Bu tertemiz derlenir. ;, if'in gövdesi olan boş bir deyimdir ve altındaki süslü parantezler her zaman çalışan serbest bir bloktan ibarettir. gcc -Wall ile derlemek bunu yakalar.

Süslü parantezlerin kendisi tek deyim için isteğe bağlıdır, ama onları bırakın. Sonradan ikinci bir satır kazanan parantezsiz bir if, klasik bir hata kaynağıdır, çünkü C'de girinti deyimleri gruplamaz.

else ve else if

else diğer yolu sağlar:

İkiden fazla sonuç için else if ile zincirleyin. C her koşulu sırayla denetler ve geçerli olan ilkinde durur:

Burada sıra son derece önemlidir. Zincir ilk eşleşmede durduğu için ikinci test yalnızca 90'ın altındaki puanları görür - score >= 80'in ayrıca && score < 90 dememesinin sebebi budur. Zinciri en kısıtlayıcı koşuldan en az kısıtlayıcıya doğru yazın, yoksa her değer ilk dala düşer.

Sondaki else isteğe bağlıdır. Zincirin her durumu kapsaması gerektiğinde bir tane ekleyin; yokluğu "hiçbiri eşleşmezse hiçbir şey yapma" demektir ki bu sorunsuzdur ama bilinçli olmalıdır.

Doğruluk: 0 Yanlıştır, Geri Kalan Her Şey Doğrudur

C'nin çekirdek dilinde koşullarda ayrı bir boolean türü yoktur. Bir if yalnızca ifadenin sıfırdan farklı olup olmadığını sorar.

Son iki satır kuralın diğer yarısını gösterir: karşılaştırma operatörleri, doğru için 1 ve yanlış için 0 üreten sıradan ifadelerdir. if (5 > 2)'nin çalışmasının sebebi budur - aslında if (1)'dir.

-3'ün C'de doğru olmasının sebebi de budur. Kural pozitif değil, sıfırdan farklıdır. Bir sayının pozitif olup olmadığını bilmek istiyorsanız if (n) değil if (n > 0) yazın.

C99, gerçek bir bool türü artı true ve false ile <stdbool.h>'yi ekledi ki bu yeni kodda daha iyi okunur. Perde arkasında yine 1 ve 0'dırlar, dolayısıyla yukarıdaki kuralla ilgili hiçbir şey değişmez - bkz. C'de booleanlar.

Koşullarda kullanacağınız karşılaştırma ve mantıksal operatörler:

==   esittir             &&   mantiksal VE (iki taraf da dogru)
!=   esit degildir       ||   mantiksal VEYA (taraflardan biri dogru)
<    kucuktur            !    mantiksal DEGIL
>    buyuktur
<=   kucuk ya da esit
>=   buyuk ya da esit

&& ve || kısa devre yapar: a yanlışsa a && b asla b'yi değerlendirmez ve a doğruysa a || b asla b'yi değerlendirmez. Bu bir iyileştirme değil bir garantidir, dolayısıyla if (n != 0 && total / n > 5) yazmak güvenlidir - n sıfırken bölme çalışamaz.

= ile == Hatası

C koşullarındaki tek en yaygın hata budur:

// HATA: x'e 5 atar, sonra 5'i (sıfırdan farklı) test eder, yani bu HER ZAMAN çalışır
if (x = 5) {
    printf("x bes\n");
}

C, bir ifadenin içinde atamaya izin verir, dolayısıyla satır geçerlidir. x'e 5 saklar, 5 değerini üretir ve 5 sıfırdan farklıdır - dal her seferinde çalışır ve x'in üzerine sessizce yazılmıştır.

İki savunma. Birincisi, her zaman uyarılar açık derleyin:

gcc -Wall -Wextra program.c -o program

GCC ve clang ikisi de "suggest parentheses around assignment used as truth value" diye işaretler. İkincisi, bazı programcılar sabiti değişkenden önce yazar - if (5 == x) - böylece yanlış yazılmış bir if (5 = x), sessiz bir hata değil sert bir derleme hatası olur. O tarz bir zevk meselesidir; uyarıları açmak değildir.

İç İçe Yerleştirme

Bir if başka bir if içerebilir. İç içe yerleştirme, yalnızca önceki bir koşul geçerli olduğunda anlam kazanan koşulları ifade eder:

İki seviye okunaklıdır. Dört değildir. İç içelik derinleştiğinde onu düzleştirmenin bir yolunu arayın - çoğu zaman koşulları && ile birleştirerek ya da başarısızlık durumlarını önce ele alıp erken dönerek:

// daha düz: istisnaları hallet, sonra işine bak
if (age < 18)     { printf("Sadece yetiskinler.\n");  return 0; }
if (!hasTicket)   { printf("Lutfen bilet alin.\n");   return 0; }
printf("Hos geldiniz.\n");

Sarkan else

Parantezsiz bir if başka birinin içine yerleştirildiğinde, bir else hangi if'e aittir? C'nin kuralı: bir else, eşleşmemiş en yakın if'e bağlanır, kodun nasıl girintilendiğinden bağımsız olarak.

// Girintiye rağmen else, İÇTEKİ if'e aittir
if (a > 0)
    if (b > 0)
        printf("ikisi de pozitif\n");
else
    printf("a pozitif degil\n");   // YANLIŞ - a > 0 ve b <= 0 iken çalışır

Girinti, else'in dıştaki if ile eşleştiğini söyler. Derleyici onu içtekiyle eşleştirir. Süslü parantezler belirsizliği tamamen kaldırır ki onları her zaman kullanmanın gerçek gerekçesi budur:

if (a > 0) {
    if (b > 0) {
        printf("ikisi de pozitif\n");
    }
} else {
    printf("a pozitif degil\n");
}

Üçlü Operatör

Bir dal yalnızca bir değer seçmek için varsa, koşul operatörü ? : bunu tek bir ifadede söyler:

kosul ? x : y'yi "koşul doğruysa x, değilse y" diye okuyun. İki daldan tam olarak biri değerlendirilir ve tamamı bir değer üretir - bir deyimin yapamayacağı şekilde atanabilmesinin ya da argüman olarak geçirilebilmesinin sebebi budur.

Onu basit değer seçimleri için saklayın. İç içe üçlüler (a ? b : c ? d : e) geçerlidir ve neredeyse her zaman yerini aldıkları else if zincirinden daha zor okunur.

Sıkça Sorulan Sorular

C'de if else deyimi nasıl yazılır?

Koşulu parantez içine, kodu süslü parantez içine koyun: if (score >= 60) { printf("Gecti\n"); } else { printf("Kaldi\n"); }. else bloğu yalnızca koşul yanlış olduğunda çalışır ve C'de then anahtar kelimesi yoktur.

Bir C if deyiminde ne doğru sayılır?

Sıfır olmayan her değer. C'nin çekirdek söz diziminde ayrılmış bir boolean türü yoktur, dolayısıyla if (n), n 0 dışında herhangi bir şeyken çalışır ve if (!n) yalnızca n tam olarak 0 iken çalışır. == ve < gibi karşılaştırma operatörleri doğru için 1, yanlış için 0 üretir.

C'de = ile == arasındaki fark nedir?

== karşılaştırır, = atar. if (x = 5) yazmak x'e 5 atar ve sonra sıfırdan farklı olan 5'i test eder, dolayısıyla dal her zaman çalışır. Hatasız derlenir; C koşullarında yeni başlayanların en yaygın hatası olmasının sebebi budur - çoğu derleyici -Wall ile bunun için uyarır.

C'de üçlü operatör nasıl çalışır?

kosul ? dogruysaDeger : yanlissaDeger, iki değerden birini üreten bir ifadedir, dolayısıyla bir atamanın ya da bir printf argümanının içinde durabilir: int max = a > b ? a : b;. Onu bir değer seçmek için, deyim çalıştırmanız gerektiğinde ise sıradan bir if kullanın.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA