15 Temmuz 2010

C/C++ işlem önceliği

Benim bir kaç günüme malolan hatalı bir varsayımdan bahsedeyim.
İlkokulda işlem önceliğini ögrendiğimizde
a - b / c
gibi bir işlemi yaparken önce bölmeyi, sonra çıkarmayı yapmamız gerektiğini öğrenmiştik. Eğer parantez varsa önce parantezler halledilir tabi.

Kod yazmaya başlayınca klasik 4 işleme ek olarak bir takım mantıksal işlemlerle de haşır neşir olduk, VE, VEYA igbi işlemlerin yanı sıra sağa ve sola kaydırma işlemleri.

C dilinde >> (sağa kaydır) işlemini her zaman bölme olarak görmüşümdür, bu yüzden de işlem sırasında bölmeye denk tuttum hep.

Bir dijital filtrem
*out = 127+ temp >> LOG_SHIFT_BITS;
şeklinde bitiyor. Burada amacım temp'i kaydırıp sonra da bir sabite ekleyerek negatif olmasını engellemek. Ancak bir çok programlama dili bu durumda önce toplamayı yapıp sonra sağa kaydırır. Sonuç ise felaket, bulması zor bir hata. Doğrusu
*out = 127+ (temp >> LOG_SHIFT_BITS);
olacak.