Turktekno.net yeniden yayına başladı!! .
Uzun süren kesintinin ardından yeniden sizlerleyiz.

C++ Dersleri [5]

Yazar admin

C++ makale serimiz devam ediyor. Makale serimizi dikkatle ve düzenli olarak takip eden okuycularımızın, C++ konusunda büyük yol katedebileceğini düşünüyoruz.
Yazı serimizin 5 bölümü yine uzun, yine dopdolu ve yine akıcı…
Konumuz ise "Operatörler"…




Operatörler I
Bunu bir örnek üzerinde anlatmak istiyorum. Örneğin; x + y ‘de x ve y operand + ise operatördür. Bu bir aritmetiksel operatördür. Matematikte işlemler operatörler ve operandlar ile anlatılır.
Operatörleri öncelikle türlerine göre ayıralım:
1) Aritmetiksel operatörler + , - , * , / , % , ++ , —
2) Karşılaştırma operatörleri < , > , <=, >= , ==, !=
3) Eşitleme operatörleri = , += , -=, *= , /= , %= , <=, >>=, &=, != , ^=
4) Mantıksal Operatörler ! , || , &&
5) Bit bazında işlem yapan operatörler & , ! , ^ , ~ ,
Aritmetiksel (Matematiksel) Operatörler:
Matematiksel ifadeleri günlük hayattaki biçimde bilgisayarda yazamadığımız için belli kurallara uymamız gerekir. Bu kısım önemli olduğu için biraz geniş yer vereceğim. Kullandığımız matematiksel işlemler ve anlamları şöyledir:

C++ işlemi:

Aritmetik operatör:

Toplama

+

Çıkarma

-

Çarpma

*

Bölme

/

Modulus(mod)

%

Bir arttırma

++

Bir azaltma

Bu operatörle verilen iki veya daha fazla operand toplanabilir. Yazılış şekli Aşağıdaki gibidir.

değişken1 + değişken2


Eğer bu iki değişkeni Sonuç gibi başka bir değişkene atarsak eşitleme operatörüyle aşağıdaki gibi yaparız.

Sonuç = değişken1 + değişken2

Buna bir örnek verelim.
// toplama.cpp
//Vize ve final notlarinindan geçme notunu hesaplama
#include
#include

main()
{
int vize, final, ort;
vize = 10;
final = 80;
ort = vize * 0.4 + final * 0.6;
cout<< "Geçme notunuz: " << ort;
}

Burada çarpma operatörünü de kullandık sanırım, artık diğerlerinin de ne olduğunu kavramış oldunuz. Bir örnekte işi ucuza getirdim :). Fakat bir artma ve bir azalmaya örnek verelim. Bu bana çok lazım olmuştu.
Burada dikkat etmemiz gereken olay " ++ " operatörünü değişkenin önüne yazmanız gerektiğidir. Bu sayede değişken bir arttırılarak işleme konur. Arkasına konursa değişken işlenir, sonra bir arttırılır. " — " operatöründe ise aynı şekilde de bir azaltma yapılır.
// carpim.cpp
// x i bir arttırıp y yi bir azaltıp çarptık.
#include
main()
{
int x = 5;
int y = 10;
cout << "x = " <<< endl;
cout << "y = " << y << endl;
cout <<"++x * –y = " << ++x * –y ;
}

İşte bir fark daha yakaladık bunu da hemen örnek üzerinde anlatalım. Sanırım buraya kadar geldiğimiz yerlerde "int" i, çarpma işlemini, bir arttırıp azaltmayı gördük, ama diyeceksiniz ki "endl " ne oluyor? Hemen açıklayayım; Satır sonunu belirterek yeni satıra geçmemizi sağlar, bir nevi " \n " Escape operatörü gibi bir işleve sahiptir.

Operatörler II

Karşılaştırma Operatörleri:

Operatör

C++ örneği

Anlamı

>

x > y

x, y’den büyüktür

<

x < y

x, y’den küçüktür

>=

x >= y

x, y’den büyüktür veya y’ye eşittir

<=

x <= y

x, y’den küçüktür veya y`ye eşittir

==

x ==y

x, y’ye eşittir

!=

x != y

x, y’ye eşit degildir

Bunların teker teker ne olduğunu söylemeye gerek yok. İfadeler gayet basittir. Burada dikkat etmemiz gereken önemli bir şey var: " >=, <=, ==, !=" notasyonlarını kullanırken iki notasyon arasında boşluk bırakmamalıyız. Buna dikkat edelim!

Eşitleme ( Atama) Operatörleri:
Bunlarıda liste halinda verelim.

Operatör

C++ örneği

Anlamı

=

x = y

x`in değeri y’ninkine atanır

+=

x += y

x`e x+y’nin değeri atanır.

-=

x -= y

x`e x-y`nin değeri atanır.

*=

x *= y

x`e x*y’nin değeri atanır.

/=

x /= y

x`e x/y`nin değeri atanır

%=

x %= y

x`e x%y’nin değeri atanır.

<<=

x <<= y

x`e x<

>>=

x >>= y

x`e x>>y’nin değeri atanır.

&=

x &= y

x`e x&y’nin değeri atanır.

!=

x != y

x`e x!y’nin değeri atanır.

^=

x ^= y

x`e x^y’nin değeri atanır.

Operatörler III

Mantıksal Operatörler (Lojik Operatör Sembolleri) :

Operatör

C++ örneği

Anlamı

!

x ! y

x değil y

&&

x && y

x ve y

||

x || y

x veya y

Burası biraz Soyut Matematik, biraz değinmek istiyorum. Yukarıda gördüğümüz mantıksal operatörler, Doğru (1) yada Yanlış (0) sonucunu argümanlara bakarak üretirler. Mantıksal Değil (!), değeri tersine çevirir. Ve ( && ) operatörü ise yalnızca her iki ifadede Doğru (1) ise sonuç Doğru (1) ` dur; diğer durumlarda Yanlış (0)` dır. Veya` da ( || ) ise yalnızca iki ifadenin Yanlış (0) durumunda sonuç Yanlış (0) olur diğer durumlarda Doğru (1)`dur.

Ne diyorlardı? En iyi programcılar matematikçilerden çıkar :). Arkadaşlar umarım zorlanmıyorsunuzdur. Olabildiğince ince eliyorum ve anlayacağınız şekle indirgemeye çalışıyorum. Bunun üstüne bir çay içerim. Geldiğimde devam edeceğim…

Bit bazında İşlem Yapan Operatörler :
Bu kısımda Soyut Matematiğin daha da ayrıntılarına girilmesi gerekiyor. Ben size kısaca bunu anlatayım. Çok karışıklık da sizi yoracaktır. Örnekleri yaparken yine üstünde dururuz.

Bit bazında işlem yapan operatörler şunlardır: AND (Ve ( & ) , OR (Veya ( ~ )), XOR ( ^ ).

And (&) operatörü; Bitleri karşılaştırır. Eğer her ikisi de Doğru (1) ise sonuç Doğru (1), aksi halde Yanlış (0)`dır.

OR (~) operatörü; İki biti karşılaştırır ve eğer ikisi de Doğru (1) ise yada birisi Doğru (1) ise sonucu Doğru (1) yapar. OR işlemi belirli bir bit i Doğru (1) e çekmek için kullanılabilir.

XOR (^) operatörü; Bit düzeyinde EXCLUSIVE OR (dışında tutan veya) (Türkçe’sini çevirince saçma oluyor) işlemi yalnızca karşılaştırılan bitler bir birinden farklı ise Doğru (1) üretir, aksi halde Yanlış (0) üretir. ! işareti ise her bir bit i ters çevirir.

Not: Bunlar yeni başlayanlar için yorucu olabilir. Son iki bölümün fazla üstünde durmayın.

Bir de bize C++ile gelmiş olan operatörlerden bahsetmek istiyorum. Bunlar;
" :: " Erim çözünürlüğü (Scope resolution operatörü).
" * " Dolaylı adresleme (Pointerlerle kullanacağız).
" & " Adres operatörü (Pointerlerle kullanacağız).
" new " Dinamik bellek ayırma .
" sizeof " Nesne Boyutu.

SABİTLER

Veriler ya nesnelerin içerisinde ya da doğrudan sabit biçiminde bulunurlar. Sabitler nesne biçiminde olmayan, programcı tarafından doğrudan girilen verilerdir. Örneğin :

x = y + z;

ifadesi bize a ve b içindeki sayıların toplanacağı ve c’ye aktarılacağını anlatır. Oysa

d = x + 10;

ifadesinde x değişkeni içinde saklanan değer ile 10 sayısı toplanmıştır. Burada 10 sayısı herhangi bir değişkenin içindeki değer değildir, doğrudan sayı biçiminde yazılmıştır.
Nesnelerin türleri olduğu gibi sabitlerin de türleri vardır. Nesnelerin türleri daha önce gördüğümüz gibi bildirim yapılırken belirlenir. Sabitlerin türlerini ise derleyici, belirli kurallar dahilinde sabitlerin yazılış biçimlerinden tespit eder.
Sabitlerin türlerini bilmek zorundayız, çünkü C dilinde sabitler ve değişkenler ve operatörler bir araya getirilerek kombine edilerek ifadeler (expressions) oluşturulur. Daha sonra detaylı göreceğimiz gibi C dilinde ifadelerin de bir türü vardır ve ifadelerin türleri, içerdikleri sabit ve değişkenlerin türlerinden elde edilir.
O halde sabit türlerini detaylı olarak inceleyelim :

(signed) int türden sabitler
Bunlar tipik olarak int türden değişkenlerine atanan ve tamsayı biçiminde olan sabitlerdir, yazılırken herhangi bir ek almazlar.

C’de int türü sınırları içinde olan her tamsayı birer int sabit (ya da int türden sabit) olarak ele alınır.
-25
30000
25789
-320
0

Sayılarının hepsi (signed) int türden sabit olarak ele alınırlar, çünkü int türü sayı sınırları içinde bulunuyorlar ve sonlarında herhangi bir ek bulunmuyor.

Ancak C dilinde int türü sistem bağımlıdır ve int sabitleri de sistemden sisteme değişebilir.

sistem

uzunluk

sınır değerler

DOS, WINDOWS 3.1 

2 byte

- 32768, + 32767

UNIX WINDOWS 95 

4 byte

-2147483648, + 2147483647

Örneğin 425000 Dos’ta int sabiti değildir ama UNİX’de int sabittir.

(signed) long türden sabitler
Long türden sabitler iki türlü ifade edilirler :
1. long int türünün sayı sınırları içinde bulunan bir sayının sonuna L ya da l yazarak.
Bu durumda derleyiciler ilgili sayı int sınırları içinde olsa da long sabit olarak ele alır. 22345l long sabittir. çünkü sonunda l eki var. 0l, -23465L, 325l long sabitlerdir.

long sabit kullanımında algılanması daha kolay olduğu için L soneki tercih edilmelidir. l soneki 1 rakamıyla görünüm açısından çok benzediği için karışıklığa neden olabilir.

2. int türün sayı sınırlarını aşan fakat long int türü sayı sınırları içinde kalan her tamsayı doğrudan long int türden sabit olarak ele alınır. Bu durum doğal olarak, DOS gibi int ve long türlerinin birbirinden farklı olduğu sistemlerde anlamlıdır.
Örneğin DOS’da
325000
-33333
1278902

long türden sabitlerdir. Oysa 32 bitlik sistemlerde long türünün uzunluğuyla int türün uzunluğu aynı (4 byte) olduğu için bu sayılar int sabiti olarak ele alınacaktır. Bu sistemlerde yukarıdaki sayıları long sabit olarak ele almak istersek sonlarına l ya da L eki eklememiz gerekmektedir.

char sabitleri (char türden sabitler)
char sabitleri tipik olarak char türden nesnelere atanan sabitlerdir. (Böyle bir zorunluluk yok)
char türden sabitler C dilinde dört ayrı biçimde bulunabilirler.

1. istenilen bir karakter tek tırnak (single quote) içerisinde kullanılırsa char türden sabit olarak ele alınır. Örnek :

‘a’
‘J’
‘Ç’
‘:’
‘8′
‘<’

Herbiri birer char türden sabitidir.

C dilinde tek tırnak içerisinde belirtilen char sabitleri, aslında o karakterin karakter setindeki (örneğin ASCII tablosundaki) sıra numarasını gösteren bir tamsayıdır.

{
char ch;

ch = ‘a’;

}
Bu örnekte aslında ch isimli char türden değişkene a karakterinin ASCII tablosundaki sıra numarası olan 97 sayısı aktarılmaktadır. Tek tırnak içindeki karakter sabitlerini görünce aslında onların küçük birer tamsayı olduğunu bilmeliyiz. Çünkü bellekte karakter diye birşey yoktur herşey ikilik sistemde 1 ve 0 lardan oluşan sayılardır.
Yukarıdaki örnekte istersek ch değişkenine aşağıdaki gibi bir atama yapabiliriz:

ch = ‘a’ + 3;.

Bu durumda ch değişkenine sayısal olarak 100 değeri atanacaktır. Bu sayıya da ASCII tablosundaki ‘d’ karakteri karşılık gelir.

2) Önceden tanımlanmış ters bölü karakter sabitleri (escape sequences)

Yukarıda tanımlanan yöntemde ekrana basılamayan yani ekranda görüntü oluşturmayan (non printable) karakterleri ifade edemeyiz. Örneğin çan karakteri (beep sesi) ya da backspace karakteri ekrana basılamaz. Tek tırnak içindeki ters bölü (back slash) karakterinden sonra yer alan bazı karakterler çok kullanılan ancak basılamayan bazı karakterlerin yerlerini tutarlar. Bunların listesi aşağıda verilmiştir:

ÖNCEDEN TANIMLANMIŞ TERS BÖLÜ KARAKTER SABİTLERİ (ESCAPE SEQUENCES)

TANIM / DESCRIPTION

ASCII NO

‘\0′

‘\x0′

‘\0′

NULL karakter

0

‘\a’

‘\x7′

‘\07′

çan sesi (alert)

7

‘\b’

‘\x8′

‘\010′

geri boşluk (back space)

8

‘\t’

‘\x9′

‘\011′

tab karakteri (tab)

9

‘\n’

‘\xA’

‘\012′

aşağı satır (new line)

10

‘\v’

‘\xB’

‘\013′

düşey tab (vertical tab)

11

‘\f’

‘\xC’

‘\014′

sayfa ileri (form feed)

12

‘\r’

‘\xD’

‘\015′

satır başı (carriage return)

13

‘\"’

‘\x22′

‘\042′

çift tırnak (double quote)

34

‘\\’

‘\x5C’

‘\134′

ters bölü (back slash)

92

Kullanılışlarına bir örnek :
{
char ch;
ch = ‘\a’;
}

3) 16′lık (hexadecimal) sayı sisteminde tanımlanmış karakter sabitleri
Tek tırnak içinde tersbölü ve x karakterlerinden sonra bir hex sayı verilirse bu ASCII tablosundaki o sayısal değerin gösterdiği sıra numarasındaki karaktere işaret eden bir karakter sabitidir.

‘\x41′ /* 41H numaralı ASCII karakteridir. */
‘\xff’ /* FFH numaralı ‘2′ karakter sabitidir. */
‘\x1C’ /* 1C numaralı ASCII karakter sabitidir. */
Not : x yerine X karakteri C’nin ilk klasik versiyonunda kabul ediliyordu şimdi artık geçerli değildir. Örnek :
{
char harf;
harf = ‘\x41′;
}

Yukarıdaki örnekte harf isimli char türden değişkene 41H ASCII sıra no.lu karakter atanmıştır. Bu da desimal sistemdeki 65 sayısına eşittir. 65 sıra nolu ASCII karakteri ‘A’ karakteridir. Dolayısıyla harf isimli değişkene ‘A’ atanmıştır.

4) 8′lik (octal) sayı sistemde tanımlanmış karakter sabitleri
Tek tırnak içinde tersbölü karakterinden sonra bir oktal sayı (en fazla 3 digit) yazılırsa bu kullanılan karakter setindeki o sayısal değerin gösterdiği sıra numarasındaki karaktere işaret eden bir karakter sabitidir. Örneğin :

‘\012′ /* 10 numaralı ASCII karakteri, Tam sayı değeri 10 */
‘\16′ /* 14 numaralı ASCII karakteri. Tam sayı değeri 14 */
‘\123′ /* 83 numaralı ASCII karakteri. Tam sayı değeri 83 */
Program içinde kullanımına bir örnek:
{
char a, b;
a = ‘\xbc’ ; /* hex sistemde tanımlanmış char sabit */
b = ‘\012′; /* oktal sistemde tanımlanmış bir char sabit */
}

7 numaralı ASCII karakteri olan çan karakterini sabit olarak 3 biçimde de yazabiliriz.

‘\x7′ /* hex gösterimli karakter sabiti */
‘\07′ /* oktal gösterimli karakter sabiti */
‘\a’ /* önceden belirlenmiş ters bölü karakter sabiti */
Burada tercih edilecek biçim son biçim olmalıdır. Hem taşınabilir bir biçimdir hem de okunabilirliği daha iyidir. Başka karakter setlerinde çan sesi karakteri 7 sıra numaralı karakter olmayabilir ama önceden belirlenmiş ters bölü karakter sabiti şeklinde ifade edersek hangi sistem olursa olsun çan sesi karakterini verecektir. Ayrıca kodu okuyan kişi çan sesi karakterinin 7 numaralı ASCII karakteri olduğunu bilmeyebilir ama C programcısı olarak ‘\a’ nın çan sesi karakteri olduğunu bilecektir.

Karakter sabitleri konusunu kapatmadan önce karakter setleri konusunda da biraz bilgi verelim :
Günümüzde kullanılan en popüler karakter seti ASCII karakter setidir. ASCII (American Standard Code for Information Interchange) sözcüklerinin başharflerinden oluşan bir kısaltmadır. ASCII setinin orjinal versiyonunda karakterler 7 bitlik bir alanda kodlanmıştır. Bazı bilgisayarlar ise 8 bit alana genişletilmiş ASCII seti kullanırlar ki bu sette 128 yerine 256 karakter temsil edilebilmektedir. Farklı bilgisayarlar farklı karakter setleri kullanabilmektedir. Örnek olarak IBM mainframe’leri daha eski bir set olan EBDCID seti kullanırlar. Unicode ismi verilen daha geliştirilmiş bir karakter seti vardır ki karakterler 2 byte alanda temsil edildikleri için bu sette 65.536 farklı karakter yer alabilmektedir. Gelecekte bir çok makinanın bu karakter setini destekleyecek biçmde tasarlanacağı düşünülmektedir.

İşaretsiz türlere ilişkin sabitler
İşaretsiz türlere ilişkin sabitler onların işaretli biçimlerinin sonuna u ya da U getirilmesiyle elde edilirler.

-15000 (signed) int sabit
15000U (unsigned) int sabit.
1200L (signed) long sabit
1200Lu (unsigned) long sabit.
Sonek olarak kullanılan l, L, u ve U harflerinin sırası önemli değildir:
123ul
123UL
123Lu
123lu
Hepsi geçerli (unsigned) long sabitlerdir.

Tamsayı sabitlerinin 16′lık ve 8′lik sistemlerde gösterilmesi
C dilinde tamsayı sabitleri (char, int, long) 10′luk sistemin yanısıra 16′lık ve 8′lik sistemlerde de yazılabilirler.
Bu sistemlerde yazılmış tamsayı sabit türleri için yukarıda verilen kurallar aynen geçerlidir. Çünkü bir sayıyı 16′lık ya da 8′lik sistemde yazmakla onun yalnızca görünümünü değiştirmiş oluruz. Sabit türleri gösterim biçimiyle değil nicelikle ilişkilidir. C dilinde ikilik sayı sisteminde sabitlerin yazılması söz konusu değildir.

16′lık sistemde gösterim 0Xbbb.. biçimindedir. (b karakterleri basamakları gösteriyor, 9′dan büyük basamak değerleri için A, B, C, D, E, F karakterleri ya da a, b, c, d, e, f karakterleri kullanılabilir.
8′lik sistemde ise 0bbb.. biçimindedir. (nadir olarak kullanılır). Örnekler:

0×12 sayısı hex gösterimli bir int sabittir. 10luk sistemde 18 sayısına karşılık gelir.
0X12L sayısı hex gösterimli bir long sabittir.
0×1C205470 hex gösterimli bir long sabittir. Çünkü (DOS’da) int sayı sınırını aşmaktadır.
0×1934ul hex gösterimli (unsigned) long sabittir.

01234 oktal gösterimli int sabit
0567L oktal gösterimli long sabit
0777U oktal gösterimli (unsigned) int sabit
0452Lu oktal gösterimli (unsigned) long sabit.

Sabitler yukarıda gösterildiği gibi her üç sayı sisteminde de yazılabilir, hatta bir ifade içinde kullanılan sabitler farklı sayı sistemlerinde de yazılmış olabilirler, bu derleme zamanında error oluşturacak bir neden olmayıp tamamen legaldir:
….
int x;
x = 0×1AC2 + 345 + 01234;

16.000 karakterlik bir makale yeterli sanırım [ ilk defa kullanıyoruz sitemizde ;)]. İsterseniz makalemize burada son verelim.
Bir sonraki konumuz ise "Gerçek Sayı Sabitleri" ve daha fazlası…

Faruk Alkaya
Selçuk Üniversitesi - Teknik Eğitim Fakültesi

Eski bölümlere ulşamak için Öğretimler kısmımızda C++ bölümüne girebilirsiniz.

Yorum Yapın