C#nedir?com
 
YAZAR HAKKINDA
Oğuz Yağmur
Oğuz Yağmur
http://www.oguzyagmur.com
İletişme geçmek için tıklayın.
26 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: anahtar baslik bildigimiz degisken derleyici dizinin fonksiyon fonksiyonun inline kelimesi sizeof standartlar standartlari tamsayi yilinda C / Sys Prog. Oğuz Yağmur
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C / Sys Prog.
Yayınlanma Tarihi : 30.3.2006
Okunma Sayısı : 18202
Yorum Sayısı : 1     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.10.2020
Turhal Temizer
Mac OS/X Removing CUDA 21.10.2020
Burak Selim Şenyurt
Sekiz Saatlik Sonsuz Döngü 21.10.2020
Burak Selim Şenyurt
Switch Case Kullanmadan Kod Yazılabilir mi? 21.10.2020
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
C99 Standartları ile Gelen Yenilikler
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

Dennis Ritchie, Unix işletim sistemi kullanan bir DEC PDP-11 ile C dilini ortaya çıkarmıştır. İlk uygulamalar da bu makine üzerinde yazılmıştır. C dili, BCPL adında bir dilin geliştirilmesi ile başlayan ve B dili ile devam eden bu sürecin bir ürünü olmuştur. 1983 yılında C nin ANSI (American National Standarts Institute - Amerikan Ulusal Standartlar Enstitüsü ) standartlarını belirlemek için bir komite kuruldu. Tahmin edilenden daha uzun süren çalışmalar sonunda (bu sürec 6 yıl kadardır) Aralık 1989 da ANSI C standartları kabul edildi. Bu satandartlar ISO (International Standarts Organizations - Uluslararası Standartlar Organizasyonu) tarafından da kabul edilmiştir. Böylece ortaya çıkan standart ANSI/ISO Standart C olarak kabul görmeye başlandı. C den bundan sonra genel olarak C89 olarak bahsedilmeye başlandı. 1995 yılında C için ilk düzeltmeler yapıldı. Daha sonraları ise C için geliştirme süreci hala devam ediyordu. Bu süreçte C nin her özelliği ayrıntılı olarak ele alındı, kullanılan yöntemler elden geçirildi ve yazılım dünyasının gelişmesi sonucunda oluşan yeni talepler de dikkate alınarak yeni düzenlemeler yapıldı. Son olarak 1999 yılında yeni standartlar açıklandı ve C için standartlar C99 standartları oldu. Bu yazıda C99 da yapılan değişiklikleri ana hatları ile inceleyeceğiz.

C99 ile C89’a yeni özellikler eklenmesine karşın, bazı özelliklerde çıkarılmış, bazı özellikler ise geliştirilmiştir. Bu yazıda sırasıyla bu özellikleri inceleyeceğiz.

C99 ile Eklenen Özellikler :

C99 standartları ile birikte C diline aşağıdaki yeni anahtar kelimeler eklenmiştir.


  • inline
  • restrict
  • _Bool
  • _Complex
  • _Imaginary
Önemli olan diğer eklemeler ise şunlardır :


  • Yeni kütüphaneler ve başlık dosyaları
  • printf() ve scanf() fonksiyon ailesinin düzenlenmesi
  • değişken uzunluktaki diziler
  • Karmaşık sayılar için destek
  • long long int değişken türü
  • C++ taki gibi // yorum satırı desteği
  • Önişlemci için yapılan bazı değişiklikler
  • for ifadesi içinde değişken tanımlama
C99 ile Dilden Çıkarılan Özellikler:

C99 ile C89 dan çıkarılan en önemli özelliklerin başında "kapalı int" kuralının kaldırılması gelmektedir. Bildiğimiz gibi C de bir tür belirtmediğimiz zaman derleyici bunu herzaman int türünden olduğunu kabul eder. Ek olarak derleyici bir fonksiyonun çağrılma ifadesini gördüğünde eğer fonksiyonun geri dönüş değeri hakkında bilgiye sahip değilse yine geri dönüş değerinin türünü int olarak kabul eder. İşte bu özellik C99 ile kaldırılmıştır. Eğer böyle bir kodunuz varsa C99 u destekleyen bir derleyici ile bu kodu derleyemezsiniz. Kodunuzu yeniden yazmanız gerekmektedir.

C99 ile Değişen ve Yeni Eklenen Özelliklerin İncelenmesi

restrict anahtar kelimesi :

restrict bir tür niteleyicisidir ve yalnızca göstericiler için kullanılabilir.

restrict int *p1;
restrict int *p2;

Bu ifadelerden derleyici p1 ve p2 yi ayrı nesneler için kullanacağı anlamını çıkarır. Böylece derleyici daha iyi kod optimizasyonu yapabilecektir. Zaten C99 ile C89 da kullanılan birçok fonksiyonun prototiplerine eklenmiştir.

inline anahtar kelimesi :

Yine derleyicinin kodu optimize etmesi için fonksiyonlarımızı c++ daki gibi inline olarak bildirebiliriz. Eğer bir fonksiyon inline olarak bildirilmişse, fonksiyon çağrılmaz bildirildiği yere açılır. Bunun bize ne gibi bir faydası olabilir? Bilindiği gibi bir fonksiyonun çağrılması zahmetli bir iştir. Fonksiyon çağrıldığı zaman değişkenler yığına yerleştirilir, registerlar kaydedilir, fonksiyon çağrılmasından sonra bunlar geri yüklenir vs vs..

Ancak biz fonksiyonu inline olarak bildirirsek bunların hiç biri gerçekleşmez çünkü fonksiyonun kodu, fonksiyonun çağrıldığı yere açılır ve program daha hızlı çalışır. Bunun dezavantajı ise kodun büyümesine neden olmasıdır. Eğer küçük fonksiyonlarımız varsa yada programımızın performansını arttıracak çok kritik fonksiyonlar varsa bunları inline olarak bildirmek en iyi yöntem olacaktır.

Örnek :

inline int max(int a, int b)
{
      return a > b?a:b;
}

int main()
{
      int x = 3, y = 5;
      printf("büyük : %d", max(x, y));
      /* eşdeğeri printf("büyük : %d", (x > y ? x : y)); yani max fonksiyonu çağrıldığı yere açılmıştır.*/
      return 0;
}



_Bool anahtar kelimesi :


_Bool bir int veri türüdür. 1 (true) ve 0 (false) değerlerine sahiptir. C++ daki bool yerine _Bool un kullanılmasının nedeni ise geriye uyumluluktur. Çünkü birçok C programcısı zaten kendi bool türlerini tanımlamış olmalarıdır. C++ daki bool türü ile uyum sağlanmak isteniyor ise <stdbool.h> dosyası dahil edilerek bool makrosu kullanılabilir.

_Complex ve _Imaginary anahtar kelimeleri :

Karmaşık sayıları desteklemek için C99 da yeni başlık dosyaları ve fonksiyonlar eklenmiştir. Böylece nümerik programlamalarda kolaylık sağlanmıştır.
complex ve imaginary yerine _Complex ve _Imaginary kullanılmasının nedeni ise birçok programda komplex sayılar için bu kelimelerin daha kullanılmasından dolayı bir isim çakışmasına neden olmamak içindir.

long long Tamsayı Tipi

C99 ile yeni tamsayı türü olarak long long int ve unsigned long long int türleri eklenmiştir. Böylece 64 bitlik tamsayıları programlarımızda rahatlıkla kullanabiliriz.

long long int -(2^63 -1) ile 2^63-1,
unsigned long long int 0 ile 2^64 - 1 arasında değer alabilir.

Dizilerdeki Değişiklikler

C89 da bildiğimiz gibi bir dizinin uzunluğunu belirtmek için sabit değerler kullanmak zorunda idik. C99 da ise herhangi bir tamsayı ile dizileri bildirebiliriz. Yani dizinin boyutunu çalışma zamanında da belirleyebiliriz. Bu özellik ile daha kolay kod yazma şansına sahip olundu.

void foo(int b1, int b2)
{
      int dizi[b1][b2]; // artık C99 ile bu geçerli bir kod.
}

Peki sizeof operatörü bu durumda nasıl davranacak. Bu özelliğin eklenebilmesi için sizeof operatöründe değişikik yapılmıştır. Bildiğimiz gibi sizeof derleme zamanı operatörüdür. Peki biz çalışma zamanında sizeof u kullanırsak ne olacak. Çalışma zamanında, boyutunu bilemediğimiz bir dizi içi sizeof kullandığımızda sizeof un değeri çalışma zamanında hesaplanacaktır.

Ek olarak bir fonksiyon parametresi olarak dizi bildiriminde bulunabiliriz. Dizinin boyutunu ise static anahtar kelimesi ile bildirebiliriz.


int foo(int dizi[static 10])
{
…..
}

Bu tanım ile dizi göstericisinin en az 10 elemanlı bir diziyi göstereceği garanti altına alınmıştır.

Ayrıca yapılarda da bu özellik kullanılabilir.

struct structFoo
{
     int x;
     int y;
     int dizi[];
}

struct structFoo *s;

s = (struct structFoo *) malloc(sizeof(struct structFoo) + 5 * sizeof(int)); // dizi için 5 int lik alan ayırıyoruz.

Tek Satırlık Yorum :

C++ da // kullanılarak tek satırlık yorum satırları ekleyebiliriz. Bu özellik C99 ile C diline dahil edilmiştir. Birçok programcı halen uzun yorumlarını C nin geleneksel çok satırlı açıklamalarını kullanarak yapar.

Değişken Bildirimleri :

Bildiğimiz gibi C89 da ilk kod ifadelerinden önce değişkenler tanımlanmalıdır. C99 ile değişkenleri artık C++’taki gibi istediğimiz yerde bildirebiliriz.

Örneğin

int main()
{
     int i;

     i = 5;
     int j; // C89 da error(hata) C99 da ise legaldir.

     j = i * 5;
     printf("%d - %d", i, j);

     return 0;
}

for Döngüsü İçinde Değişken Bildirme :

C99 ile for döngüsünde değişiklikler yapılarak döngünün ilk kısmında bir yada daha fazla değişken

edebiliriz. Tanımladığımız değişkenlerin kapsamı ise for bloğu ile sınırlıdır.

Örneğin :

int main()
{
     int i = -1;

     for(int i = 0; i < 5; ++i)
          printf("%d ", i); //0 1 2 3 4 5

     printf("%d ", i); // -1

     return 0;
}

for döngüsünde tanımlanan i değişkeni döngü bittiği zaman yok edilir. Bu özellik C++ da zaten sıklıkla kullanılmaktadır.

Dizilerde İlk Değer Atama :

C99 ile programcılara kolaylık sağlayacak yeni bir özellik eklendi. Örneğin dizinin bazı elemanlarına değer atarken diğer elemanlarına değer atamak istemeyebiliriz. C99 ile bu mümkün olabilmektedir.

Örneğin :

int dizi[10] = {[3] = 5, [5] = 15};

Bu özellik yapılarda şöyle kullanılır.

struct structFoo
{
      int a;
      int b;
      int c;
} sFoo = {.c = 67, .a = 65}; // b ye değer atamak istemedik.


printf() ve scanf() fonksiyon ailesindeki değişiklikler :

C99 ile printf ve scanf fonksiyon aileleri long long int ve unsigned long long int veri türleri ile çalışma yeteneği eklenmiştir. long long için biçim belirleyici olarak ll kullanılır.
Örneğin :

int main()
{
      long long int a;
      unsigned long long int u_b;

      printf("%lld - %llu ", a, u_b);

      return 0;
}

C89 daki Limitlerin Artırılması :

Bilindiği gibi C89 da C derleyicileri öğeleri (case sayısı, fonks. Parametre sayısı, iç içe blok sayısı vs vs) ele alıp incelemesi için bazı kısıtlamalar vardı. Bunlar C99 ile arttırılmıştır. Örneğin


Sınır C89 C99
İç içe blok sayısı 15 27
Değişken isim uzunluğu(anlamlı) 31 63
extern değişken "" "" 6 31
Yapı ve union daki üye sayısı 127 1023
Fonksiyon çağırırken parm. Sayısı 31 127

return ifadesindeki değişiklik :

C89 da bir fonksiyonun geri dönüş değeri void değilse biz fonksiyonu return; ile sonlandırabiliridik. Bu özellik C99 ile kaldırılmıştır. Yani aşağıdaki metot bildirimi artık geçersizdir.

int foo()
{
      return; // error bir değer döndürmelidir.
}

C99 ile gelen yeni kütüphaneler :

C99 ile bazı yeni kütüphane ve başlık dosyaları dahil edilmiştir.
Bunlardan bazıları;

<complex.h> karmaşık sayıları destekler
<inttypes.h> standart, taşınabilir tamsayılar tanımlıdır.


Örneğin:

int16_t tam olarak 16 bitlik tamsayı
intmax_t enbüyük tamsayı tipi
uintmax_t enbüyük işaretsiz tamsayı tipi

<wchar.h> Unicode karekter fonksiyonalarını destekeler.

Bu değişiklikler sonunda bir kez daha gördük ki C yine kendini ve gücünü ispatlamıştır. Birçok yenilik eklenmesine karşın C doğallığından ve esnek yapısından hiçbirşey kaybetmemiş aksine gücüne güç katmıştır.

Makale:
C99 Standartları ile Gelen Yenilikler C ve Sistem Programlama Oğuz Yağmur
  • Yazılan Yorumlar
  • Yorum Yaz
MAY
31
2004
uzun zamandır C99 standartlarını ayrıntılı bir şekilde incelemeyi dünüyordum ama bir türlü fırsat bulamamıştım.kendi adıma bu güzel yazıyı hazırladığınız için teşekkür ederim
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor