Sayfalar

1/24/2011

İfadeler ve Komutlar (Bölüm - 1)

(Expressions and Statements)

Bir program, özünde, sırayla çalıştırılan bir komutlar bütünüdür. Bir programın gücü, belirli bir koşul doğru veya yanlış olarak gerçekleştiğinde belirli bir grup komutu çalıştırabilme becerisinden gelir.

Bu bölümde öğrenecekleriniz:
  • Komutlar nedir?
  • Bloklar nedir?
  • İfadeler nedir? 
Komutlar:
C++'da bir komut yürütmenin sırasını denetler, bir ifadeyi değerlendirir veya hiç bir şey yapmaz (boş komut). Tüm C++ komutları noktalı virgülle sonlanır, sadece noktalı virgülden ibaret olan boş komut da bu şekilde sonlanır. En genel komutlardan biri aşağıdaki atama komutudur:

x = a + b;

Cebirden farklı olarak bu komut x'in a+b'ye eşit olduğu anlamına gelmez. Bunun anlamı "a ve b'nin değerleri toplamını x'e ata" veya "x'e a+b'yi ata" şeklinde yorumlanmalıdır. Bu komut aynı anda iki iş yapıyor olsa da tek bir komuttur ve tek bir noktalı virgülü vardır. Atama operatörü eşit işaretinin sağındakini işaretin solundakine atar.

Boşluk (Aralık veya boş satır da denebilir)

Tab, ara boşluğu ve yeni satırlar genellikle komutlarda ihmal edilirler. Yukarıdaki atama komutu şu şekilde de yazılabilir ve hatalı değildir:

x =a
+ b ;

Boşluk kullanımı bir kodu daha okunur kılabileceği gibi yukarıdaki örnekte görüldüğü üzere tamamen karmaşık (fakat yine de hatalı olmayan) yazım örnekleri de üretebilir.

Bloklar ve Bileşik Komutlar

Güzel parantez ( { ) arasında yer alan tüm komutlar bir blok olarak değerlendirilir. Bir blok { ile başlar/açılır ve } ile biter/kapatılır.

{
temp = a;
a = b;
b = temp;
}

Bu blok tek bir komut olarak çalışır ve a ile b'nin değerlerini kendi aralarında değiştirir.

İfadeler

C++'ta bir değere tekabül eden her şey bir ifadedir. Yani bir ifade bir değer döndürmelidir. 3+2 ifadesi 5 değerini döndürür ve bu durumda bir ifadedir. Tüm ifadeler birer komuttur.

İfade olarak nitelendirilebilecek birçok kod parçacığı sizi şaşırtabilir. İşte bir kaç örnek:

3.2 ; //3.2 değerini döndürür.
PI ; //3.14 değerini döndüren float const değer.
SecondsPerMinute ; //60 değerini döndüren int const değer.

PI'nin 3,14'e eşit, SecondsPerMinute'in 60'a eşit birer sabit olduğunu varsayarsak bu üç komut da birer ifadedir.

x = a + b;

ifadesi sadece a ve b'yi toplayıp x'e atamaz, ayrıca bu atamanın sonucunu da (x'in değerini) döndürür.

Bu durumda bu komut da bir ifadedir. İfade olduğu için bir atama operatörünün sağ tarafında olabilir:

y = x = a + b;

Bu satır şu sırayla değerlendirilir: a'yı b'ye ekle.

a + b'nin sonucunu x'e ata.

x = a + b atama ifadesinin sonucunu y'ye ata.

a, b, x ve y'nin hepsi birer tam sayıysa ve a'nın değeri 2 ve b'nin değeri 5 ise, hem x'e hem de y'ye 7 değeri atanır.

Örnek: Karmaşık ifadelerin değerlendirilmesi

#include <iostream.h>
int main()
{
     int a=0, b=0, x=0, y=35; //Burada dört değişken tanımlanıp ilk atamalar yapılıyor
     cout << "a: " << a << " b: " << b; //a ve b'nin değerleri ekrana bastırılıyor
     cout << " x: " << x << " y: " << y << endl; //x ve y'nin değerleri ekrana bastırılıyor
     a = 9; //a'ya 9 değeri atanıyor
     b = 7; //b'ye 7 değeri atanıyor
     y = x = a+b; // a ve b toplanıp değeri x'e atanıyor.  
                         //x = a + b ifadesi bir değere karşılık geliyor ve bu değer de y'ye atanıyor.            
     cout << "a: " << a << " b: " << b; //a ve b'nin değerleri ekrana bastırılıyor
     cout << " x: " << x << " y: " << y << endl; //x ve y'nin değerleri ekrana bastırılıyor
     return 0;
}


Ekran Çıktısı: a: 0 b: 0 x: 0 y: 35
a: 9 b: 7 x: 16 y: 16

Operatörler

Bir operatör, derleyiciye işlem yapacağını bildiren bir simgedir. Operatörler terimler üzerinde işlem yapar ve C++ tüm terimler birer ifadedir. C++'da bir kaç farklı kategoride operatör bulunur. Bu kategorilerden iki tanesi

Atama operatörleri ve

Matematik operatörleridir.

Atama Operatörü

Atama operatörü (=), operatörün sağ tarafındaki değerin sol tarafındaki terime atanmasına sebep olur (yani kabaca söylemek gerekirse, sol taraftaki terime daha önceden bir değer verilmişse bu değer silinir, yerine yeni değer yazılır).

x = a + b;

yukarıdaki ifade a ve b toplamının sonucunda elde edilen değeri x terimine atar.

Atama operatörünün sol tarafına yazılmasında sakınca bulunmayan bir terime lvalue da denir (buradaki "l" harfi sol anlamına gelen "left"in ilk harfidir). Aynı şekilde operatörün sağ tarafındaki terime de rvalue (sağ kelimesinin ingilizcesi olan "right"ın ilk harfi) denir.

Sabitler rvalue tipindedir. Bunlar lvalue tipinde olamazlar, bundan ötürü

x = 35; // ok

yazabilirsiniz ancak

35 = x; // hata, bir lvalue değil!

yazamazsınız! çünkü 35 bir sabittir ve üzerine atama yapılmaz.

Matematik Operatörleri

Beş adet matematik operatörü vardır: toplama (+), çıkartma (-), çarpma (*), bölme (/) ve modülüs (%).

Toplama ve çıkartma işlemleri tahmin ettiğiniz üzere çalışır; fakat  unsigned integer tipindeki değerlerle yapılan çıkartma işlemlerinde sonuç negatif sayı verecekse (örneğin 3 - 5 işleminin sonucu -2'dir) süpriz sonuçlar ortaya çıkabilir.

Ayrıca bölme işlemlerinde 0'a bölme durumu belirsiz bir sonuç ürettiği için mutlaka kontrol edilmelidir. Yani bölen sayının 0'dan farklı bir değer olduğu kontrol edilmelidir ve 0 olduğu durumlarda işlem gerçekleştirilmemeli ve kullanıcı uyarılmalıdır.


Tam Sayı Bölme ve Modülüs

Tam sayı bölme işlemi gündelik yaşamda gerçekleştirdiğimiz bölme işleminden biraz faklıdır. 21'i 4'e böldüğünüzde elde edeceğiniz sayı ondalıklıdır. Tam sayıların ondalık kesirleri yoktur ve "kalan" değer kesilir, ihmal edilir. Dolayısıyla bu bölme işleminin sonucu tam sayı olarak 5'tir. Bu bölme işleminin kalanını elde etmek için modülüs (%) operatörünü kullanırsanız sonuç 1 olur. Yani 21 / 4'ün sonucu 5 iken, 21 % 5'in sonucu 1'dir. Modülü operatörü bir tam sayı bölme işlemi sonucunun kalan değerini verir.

Kalan hesabı her 10'uncu işlemde mesaj bastırmak istediğinizde faydalı olabilir. Sadece 10 ve 10'un katları olan sayılar 10'a tam olarak bölünebildiğinden bunların kalanları 0'dır. Bu durumda bir sayının 10'a bölündüğünde kalanını elde etmek için modülüs operatörü 0 döndürdüğünde 10. (veya 10'un katı olan) işlem bulunmuş olur. Bu özelliği daha sonra loop (çevrimlerde) işlemlerinde kullanacağız.

int x = 10;
int kalan = x % 10;
if (kalan == 0)
    printf("x, 10'a tam bolunebilir");

Bölüm 1'in sonu.