2.2. Bağıntısal Ve Mantıksal İşleçler
C dilinde dokuz işleç, doğru veya yanlış
diye yorumlanabilecek değerler verir. Klasik C’de özel bir Boolean
(yani mantıksal) veri tipi yoktur ve bu işleçlerle oluşturulmuş bir ifadenin
değeri, eğer ifade doğru ise, 1, yanlışsa 0’dır. Aslında, sıfırdan farklı
her sayı C dilinde doğru
anlamını taşır. Böyle bir sonucun tipi
her zaman int
’tir. Aşağıda, bu işleçler, azalan
öncelik sıralarına göre anlatılmaktadır. Bütün doğruluk-değerli işleçler,
struct
ve türevleri dışında, her tipten işlenen kabul
eder. Sağdan sola doğru birleşen !
tekli işleci
dışında, burada anlatılan tüm işleçler soldan sağa birleşirler. Bağıntısal ve
mantıksal işleçler değişmez ifadelerde de kullanılabilirler.
Mantıksal Olumsuzlama İşleci !
!
(değil
)
işleci işlenenin mantıksal değerini olumsuzlar; yani eğer işlenen 0’sa 1
verir, eğer işlenen sıfırdan farklı ise 0 verir. Örnekler:
Bu ve bir sonraki kısımda: a=150; b=45.33; c=-132; d=0;
!a | değeri 0’dır |
!c | değeri 0’dır |
!d | değeri 1’dir |
!(b+c) | değeri 0’dır |
!!c | değeri 1’dir |
Bağıntısal İşleçler <
, >
,
<=
, Ve >=
Bu işleçlerin isimleri şöyledir:
İşleç | İsim |
---|---|
< |
küçüktür |
> |
büyüktür |
<= |
küçük veya eşittir |
>= |
büyük veya eşittir |
Bağıntısal işleçler işlenenlerini karşılaştırır ve duruma göre doğru veya yanlış bir değer verirler. Örnekler:
a<b | değeri 0’dır |
b>=d | değeri 1’dir |
a>b>c | (a>b)>c ’ye
eşdeğerdir ve değeri 1’dir |
a<c<b | (a<c)<b ’ye
eşdeğerdir ve değeri 1’dir |
Eşitlik İşleçleri ==
Ve !=
==
işleci, eğer işlenenleri eşitse 1,
yoksa 0 verir. !=
işleci ise tam tersini yapar. Sık yapılan bir
yanlış, ==
işleci yerine atama işlecini (=
)
kullanmaktır. Buna dikkat edin. Örnekler:
a==b | değeri 0’dır |
a=b | değeri b ’dir ve bir atama ifadesidir |
Bizim sistemde,
float x = 5.0/3.0;
deyiminden sonra 5.0==3.0*x
ifadesi 0 (yani yanlış!) verir. Bunun nedeni hiçbir
bilgisayarın, 1.666666… sayısındaki sonsuz sayıda
6’yı saklayamamasıdır. Aynı sorun 3.0
yerine
25.0
de kullansanız ortaya çıkabilir. Genelde, kayan noktalı
sayıların kesin olmasını bekleyemezsiniz, bundan dolayı (derleyici tarafından
izin verilmesine rağmen) <=
, >=
ve eşitlik
işleçlerinin işlenenleri olarak float
tipinde
ifadeler kullanmak tehlikelidir.
Mantıksal VE İşleci &&
&&
işleci işlenenlerinin mantıksal
VE’sini verir, yani eğer her iki işlenen doğru ise sonuç 1 olur, aksi
takdirde 0’dır. Bu tanımdan, eğer işlenenlerden biri 0’sa sonucun
kesinlikle sıfır olacağı ve diğer işlenenin değerinin hesaplanmasına
gerek olmadığı açıktır. C, bu gerçeğe dayanarak, diğer bazı dillerin tersine,
ilk işlenenin değeri 0’sa ikincisini hesaplamaz. Örnekler:
fn()
’nin 657 veren bir fonksiyon olduğunu varsayın.
a&&b | değeri 1’dir |
d&&fn() | değeri 0’dır ve fn() çağrılmaz |
fn()&&d | değeri 0’dır ve fn() çağrılır |
Mantıksal VEYA İşleci ||
||
işleci işlenenlerinin mantıksal
VEYA’sını verir, yani eğer her iki işlenen yanlış ise sonuç 0 olur, aksi
takdirde 1’dir. Gördüğünüz gibi, eğer işlenenlerden biri
sıfırdan farklı ise, öteki işlenenin değeri ne olursa olsun sonuç 1’dir.
Yukarıda anlatılan yararlı özellik burada da geçerli olur; eğer ilk işlenen
sıfırdan farklı ise, ikinci işlenen hesaplanmaz. Örnekler:
a||d | !(!a&&!d) ’e eşdeğerdir ve değeri 1’dir |
a||b | değeri 1’dir |
c||d | değeri 1’dir |
d||(!c) | değeri 0’dır |
b||fn() | değeri 1’dir ve fn() çağrılmaz |