9. Bölüm
Cenker Özkurt
Bu sayımızdan itibaren Erdem Taylan arkadaşımızın görevini ben almış bulunuyorum. Ben de aynı şekilde sizlere "The C Programming Language" kitabının paralelinde, Amiga C ile neler yapabileceğinizi ve elinizdeki hazineyi nasıl kullanmanız gerektiğini göstermeye çalışacağım. Herşeyden önce Amiga C hakkındaki görüşlerimi belirterek ilk yazı dizime başlamak istiyorum.
Amiga ile yapabileceklerinizin sınırı yok gibidir. Fakat önemli olan elinizdeki aleti tam olarak kullanabilmek. Bunu yapmanın birçok yolu var, kiminiz bunu animasyon, grafik veya müzik olarak yapmaya çalışıyorsunuz. Bilgisayarını bu şekilde kullananlara Amiga'yı tercih ettikleri için teşekkür etmek istiyorum. Bence en akıllı seçim. Kiminiz ise program yazıyor. Program yazanlar, Amiga'nın içindeki hazineleri keşfetmeye çalışıyorlar. Tabii ki benim amacım da bu arkadaşlarımıza yardımcı olmak.
C dili, Amiga için en ideal dillerden biri. Fakat bu dili tam anlamıyla kullanabilmek için Amiga sistemini biraz tanımak gerekiyor.
Amiga'da C ile çalışmak isteyen arkadaşlara, kullanabilecekleri C derleyicileri hakkında biraz bilgi vermek istiyorum. Şu anda benim kullandığım Manx firmasının geliştirmiş olduğu Aztec C derleyicisidir. Bu derleyicinin kullanımı oldukça kolay. Tavsiyem sizin de bu derleyiciyi en yakın zamanda elde etmeniz. İkinci derleyicimiz ise Lattice C. Aztec C'de yazmış olduğunuz programları bu derleyicide de çalıştırabilirsiniz.
Artık bu ayki yazımıza başlayabiliriz. Bu haftaki konularımız sırası ile; ifadelerdeki tür değişmeleri, arttırma ve eksiltme operatörleri, bit düzeyli mantıksal operatörler, eşleme operatörleri, şartlı ifadeler ve son olarak da operatör işlem öncelik sırası.
İFADELERDEKİ TÜR DEĞİŞMELERİ:
Bu bölümde farklı türlerdeki değişkenlerin, program içerisindeki tür değişimlerini inceleyeceğiz.
Değişkenler birbirlerine aktarılırken, sağdaki değer soldaki değere çevrilir. Aşağıdaki örnekte olduğu gibi c değişkeni karakter (character), i değişkeni ise tamsayı (integer) türünden, c karakter değişkeni tamsayıya çevrilerek, i tamsayı değişkenine aktarılır. Bilindiği gibi integer değişkenler 2 byte, karakter (character) değişkenler ise l byte uzunluktadır. Yani buradaki karakter değişkeni, integer değişkenine aktarılırken, integer değişkeninde 1 byte'lık bir artış meydana gelir. Bu bir sorun çıkarmaz. Fakat bu işlemin tersi yapıldığında, yüksek düzeydeki bitler gözönüne alınmaz. Sonuç olarak integer değişkeninin alt bir byte'lık bölümü değerlendirilerek karakter değişkenine aktarılır. Daha önceki sayımızda, türler arasındaki çevirim ilkelerini hatırlayın.
int i; char c; t=c; c=i;Bu işlemin sonunda c değişkeninin değeri işaretiyle birlikte hiçbir değişikliğe uğramaz.
ikinci olarak tek duyarlılıklı virgüllü sayılar (float) ve tamsayı (integer) türündeki değişkenlerin, eşleşmeleriyle ilgili örneği görüyorsunuz.
float x; int i; x=i; i=x;Burada x float, i integer türünden. x=i işleminin sonunda, i integer değişkeni float'a çevrilerek x'e aktarılır. Son olarak i=x'ten sonra, x değeri i'ye aktarılmaktadır. Burada her iki değeri okuduğumuzda aradaki farkın float olan x değişkeninin sonuna 6 adet sıfır eklendiğini, float sayıyı integer'e çevirme sonunda da virgülden sonraki sıfırlann atıldığını göreceksiniz. Bunun sebebi tabii ki iki değişkenin de farklı tür ve byte uzunluklarında olmasından.
Diğer tiplerdeki eşitlemelerde ise double, float'a; long, short'a yuvarlanır. Bu işlem, üst düzeydeki bitlerin bertaraf edilmesi sonucu oluşur.
İfadelerdeki tür değişimleri ikinci olarak, kullanacağımız fonksiyonun istediği değişken türünü sağlamak için kullanılır.
Örneğin:
sqrt((double) n);Burada sqrt() (kök alma) fonksiyonu çalışmadan önce, n değişkeni double (çift duyarlıklı virgüllü sayı) olarak değiştirilir. Buradaki değişikliğin nedeni, sqrt() fonksiyonunun parametresinin double olması gerekliğindendir.
ARTTIRMA VE EKSİLTME OPERATÖRLERİ:
C dilinde artırma ve eksiltme operatörleri iki türlü kullanılmaktadır. Bu programcılık bakımından büyük kolaylık sağlar. Bunları (++) artırma ve (--) eksiltme operatörlerini bir değişkenin önüne ve arkasına koyarak kullanabiliriz. Bildiğiniz gibi bu iki fonksiyon, bir sayıyı arttırmada veya azaltmada kullanılır. Şimdi aşağıdaki örneği inceleyelim:
n=5; x=n++; x=++n;x=n++ işlemi gerçekleştirilirken, ilk olarak n değişkeninin değeri x'e aktarılır ve sonra n, bir arttılır. Sonuç olarak x=5, n=6 olur. İkinci olarak da x=++n işleminde (++ işaretinin n'in önünde olduğuna dikkat edin.) önce n bir artırılır sonra x'e verilir. Sonuç x=7 olacaktır. Aşağıda s karakter dizisinin (string) içindeki c karakterlerini silmek için verilmiş bir örneği görüyorsunuz:
squeeze(s,c)
char s[];
int c;
{
for(i=j=0;s[i]!='0';i++)
if(s[i]!=c) s[j++]=s[i];
}
BİT DÜZEYLİ MANTIKSAL OPERATÖRLER:
C dilinde birçok sayıda bit düzeyinde mantıksal işlem yapabilirsiniz. Bu işlemler, double ve float türündeki değişkenler için geçerli değildir.
Bu operatörlerin başlıcaları şunlar:
& Bit Düzeyinde AND | Bit Düzeyinde OR << Bit Düzeyinde Sola Kaydırma >> Bit Düzeyinde Sağa KaydırmaAND mantıksal operatörü daha çok maskeleme için kullanılır. Bir örnek verecek olursak; "c=n & 10" işleminde, n değişkeninin değeri ile 10 sayısı AND işlemine sokularak c değişkenine aktarılır.
c= l & 2;Burada c=3 olur.
OR mantıksal operatörü de, daha çok işlenen biti SET (1) yapmak için kullanılır.
c= 10 & 255;Burada da c=255 olur.
<< operatörü, bir değişkeni işlediğimiz sayıda sola bir bit kaydırmamıza (shift) yarar.
n= x << 2;örnekten de anlaşılaşacağı gibi, bu işlemin sonunda x değişkeninin bitleri 2 bit sola kayar. Yani diğer bir deyişle x değişkeninin değerini 4 ile çarpmış oluruz, n = x << 2 örneğinde ise x bitlerinin tamamını sağa kaydırmış yani 4'e bölmüş oluruz.
Aşağıdaki örnek ise, verilen integer değişkenindeki 1 olan bitleri saymaktadır.
bitcount(n)
int n;
{
int b;
for(b=0;n!=0:n>>=1)
if(n & l) b++;
return(b);
}
EŞLEME OPERATÖRLERİ:
Eşleme işlemlerinde çeşitli kullanım kolaylıkları sağlanmıştır. i=i+2 yerine C dilinde. i+=2 yazmak mümkündür. Burada + (artırma) işlemi yapılmıştır. Bu operatörün yerine +, -, *, /, %, <<, >>, &, ^ ve | operatörleri de kullanılabilir.
ŞARTLI OPERATÖRLER:
if(a>b) z=a; else z=b;Bu örnekte z, en büyük değeri alacaktır. C dilinde bunu yapmanın ikinci ve pratik bir yolu da, ¿: ikilisidir. Genel gösterim e1 ¿ e2 : e3 şeklindedir. e1 şartlı ifade, e2 ve e3 ise bu ifadenin doğruluğuna bağlı olarak oluşan iki ifadedir. (a>b) ifadesinin sıfırdan farklı yani "doğru" olması durumunda z=a, aksi takdirde de z=b olacaktır. Burada (a>b) e1, a e2, b e3'e eşittir. e1, e2 ve e3 ifadeleri farklı türlerde olabilir.
for(i=0;i<=1O0;i+=10)
for(j=1;j<=10;j++)
printf("%d",i+j,(j==10) ¿ ":'');
Yukarıdaki örnekte, her ona kadar sayım sonucunda yeni bir satıra geçilir.
OPERATÖR İŞLEM ÖNCELİK SIRASI:
İşlemin doğru olabilmesi için operatör işlem öncelik sıralarını bilmek gerekmektedir. Ayrıca bu işlemlerin hesaplama yönleri de önem taşımaktadır. Genel olarak işlem öncelik sıraları ve yönleri şöyle sıralanmaktadır:
Operatör: İşlem Yönü: () [] -> . soldan sağa ! ++ -- - (tür) * & sizeoff sağdan sola * / % soldan sağa + - soldan sağa << >> soldan sağa < <= > >= soldan sağa == != soldan sağa & soldan sağa ^ soldan sağa | soldan sağa && soldan sağa || soldan sağa : sağdan sola = += -= vb. sağdan sola , soldan sağaşeklindedir. x=f() + g() örneğinde ise, sırasıyla g() ve f() fonksiyonları hesaplanır ve x'e aktarılır.
printf("%d %d ", ++n, power(2,n));
Buradaki kullanım şekli yanlıştır. Çünkü önce fonksiyon hesaplanacak sonra n bir artırılacaktır.
++n;
printf("%d %d ", ++n power(2,n));
kullanımı daha doğrudur. Buradan da anlaşılacağı gibi öncelik sıralarını bilmek, programın doğruluğunu sağlamak için gereklidir.
Bu aylık bu kadar. Gelecek ay program akış kontrollerini sağlayan cümleler ve bloklar, IF-ELSE ELSE-IF ikilileri, SWITCH, WHILE, FOR, DO-WHILE, BREAK, CONTINUE ve GOTO komutlarını toplu olarak göreceğiz.
Hoşçakalın...