Mantıksal ve İlişkisel İşlemler

İlişkisel ve mantıksal işlemleri kullanırken doğru ve yanlış kavramları karşımıza çıkar. C'de 0 yanlış, 0'dan farklı değerler doğru kabul edilir. Mantıksal ve ilişkisel işlemlerin sonucunun doğru olması durumunda çıktımız 1, yanlış olması durumunda çıktımız 0'dır. Tüm bu ifadelerin ne manaya geldiğini ilerleyen kısımlarda anlatacağız. Fakat önce mantıksal ve ilişkisel işlemlerin neler olduklarına bakalım.


Mantıksal İşlemler

Mantıksal işlemler veveya ve değilidir.

İki ifade birbirine ve mantıksal işlemi ile bağlandığında iki ifadenin birden doğru olması durumunda çıktımız da doğru (1), diğer durumlarda çıktımız yanlış (0) olacaktır. C'de ve mantıksal işlemi "&&" ile ifade edilir.

İki ifade birbirine veya mantıksal işlemi ile bağlandığında iki ifadenin birden yanlış olması durumunda çıktımız da yanlış (0), diğer durumlarda çıktımız doğru (1) olacaktır. C'de veya mantıksal işlemi "||" ile ifade edilir.

Bir ifadenin değili ifadenin doğruluğunu veya yanlışlığını tersine çevirir. İfademiz doğruysa çıktımız yanlış (0), ifademiz yanlışsa çıktımız doğru (1) olacaktır. C'de değili mantıksal işlemi "!" ile ifade edilir.

Şimdi hem bu üç işlemi hem de konunun en başındaki ifadeleri anlamak için bir örnek yapalım:

#include <stdio.h>

int main(void){
    char a=1;
    char b=0;
    char c=0;
    if(!((a||b)&&c)==0){
        printf("Zero");
    }
    if(!((a||b)&&c)==1){
        printf("One");
    }
    return 0;
}

a, b ve c olmak üzere 3 değişken tanımlanmıştır. a'nın değeri 1, b ve c'nin değerleri 0 olarak atanmıştır. Sonrasında !((a||b)&&c) işlemi yapılacak ve sonuç 1 ise One, 0 ise Zero yazdırılacaktır. İşleme bakalım;

En önce parantezin içindeki işlem yaplacaktır (a||b) yani (1||0). Bu işlemin sonucu 1'dir.
Daha sonra && işlemi yapılır. (1&&c) yani (1&&0). Bu işlemin sonucu 0'dır.
Son olarak da ! işlemi yapılır: !0, yani 1. Çıktımız "One" olacaktır.

Eğer c'nin değeri 1 olarak atanmış olsaydı. Bu durumda parantez içindeki işlem aynı olacaktı fakat sonraki işlemler şu şekilde cereyan edecekti:

!(1&&c) = !(1&&1) = !1 = 0. Bu durumda çıktımız "Zero" olacaktı.

Bu örnek mantıksal işlemleri  ve işlemlerin çıktısının 1 veya 0 olduğunu anlamak için yeterlidir. Fakat en başta C'de 0 haricindeki değerlerin doğru kabul edildiğini söylemiştik. Bunu test etmek için c'ye 5 değerini atayın. Bu durumda yukarıdaki işlem şu şekilde cereyan edecektir:

!(1&&c) = !(1&&5) = !1 = 0.

Görüldüğü gibi 5 değeri de 1 değeri gibi doğru kabul edilmiştir.


İlişkisel İşlemler

İlişkisel işlemler ise iki ifadeyi kıyaslar ve buna göre ortaya bir sonuç çıkarır. İlişkisel işlemler şunlardır:
> : Büyüktür
>= : Büyük veya Eşittir
< : Küçüktür
<= : Küçük veya Eşittir
= = : Eşittir
!= : Eşit değildir
İlişkisel işlemin doğru olması durumunda sonuç 1 yanlış olması durumunda sonuç 0'dır.
Hem mantıksal hem de ilişkisel işlemleri içeren bir örnek yapalım:

#include <stdio.h>

int main(void){
    char a=1;
    char b=0;
    char c=5;
    if(((a>b)&&(c<=a))==0){
        printf("Zero");
    }
    if(((a>b)&&(c<=a))==1){
        printf("One");
    }
    return 0;
}

Bu örnekte "(a > b) && (c <= a)" ifadesi yer almaktadır. a > b yani 1 > 0 ifadesi doğrudur. c <= a yani 5 <= 1 ifadesi yanlıştır. Bu nedenle ifadenin sonucu "1 && 0 = 0"dır. Bu durumda çıktı olarak "Zero" yazdırılacaktır.

Eğer c'ye de değer olarak 0 atanmış olsaydı ikinci parantez içindeki ifade de doğru olacak ve sonuç 1 olacaktı. Bu sefer çıktı olarak "One" yazdırılacaktı.

Aslında ilk if parantezindeki ifadenin tamamı "(a > b) && (c <= a) == 0" şeklindedir. Yani == işlemi de ifadede yer almaktadır. Parantez içindeki ifade doğru olduğu durumda alttaki komut uygulanmaktadır. Yani aslında örneğin yorumlanmasında en son olarak 0 == 0 ifadesini elde etmekteyiz ve bu sonuç doğru olduğu için "Zero" ifadesi yazdırılmaktadır. Alttaki ifadede ise elde ettiğimiz son işlem 0 == 1 olmaktadır. Bu ifade yanlış olduğu için de "One" ifadesi yazdırılmamaktadır. Ayrıca bu örnekte "== 1" şeklinde bir ifade yazmak aslında biraz amatörcedir. Bunun nedenini de if komutunun çalışma mantığının detayını da ileride işleyeceğiz. 

Şunun da akılda tutulması gerekir: == ile = farklı işlemlerdir. == iki tarafın eşit olup olmadığını değerlendirmede kullanılırken = atamada kullanılır.

Mantıksal ve ilişkisel işlemlerin öncelik sırası yüksekten alçağa şu şekildedir:

(!)
(>), (>=), (<), (<=)
(==),(!=)
(&&)
(||)

Aritmetik işlemlerde olduğu gibi ilişkisel ve mantıksal işlemlerde de işlem önceliği aynı olan iki işlemden solda yazılan daha önce yapılır. Ayrıca yine aynı aritmetik işlemlerde olduğu gibi parantezler yardımıyla istenen işlemin önce yapılması sağlanabilir.