C Programlama Dili'ne Giriş

  Dersler
* Önsöz

* Giriş
* Veri Tipleri, Değişkenler
* Operatörler
* Temel G/Ç Fonksiyonları
* Temel Kütüphane Fonksiyonları
* Karşılaştırma Deyimleri
* Döngüler
* Fonksiyonlar I
* Fonksiyonlar II
* Diziler
* Gösterici (Pointer) Kavramı
* Katarlar (Stringler)
* Dinamik Bellek Yönetimi
* Gösterici Uygulamaları
* Yapılar ve Birlikler
* Dosya Yönetimi
* Bit Düzeyinde Çalışmak
* Port Denetimi
* Grafik Kullanımı
* C Makroları

* Kısaca C++
* Derleme Seçenekleri
* Tarih-Saat Fonksiyonları
* Monte-Carlo Yöntemleri
* Fortran ve C

* Yararlanılan Kaynaklar

  C/C++ Derleyicileri
* Dev-C++
* Salford (silversoft FTN95)
* GCC
* Turbo C
* Eclipse IDE
* NetBeans IDE

  Dış Bağlantılar
* programlama.com
* C Programcıları Derneği

* C (wikipedia)
* C++ (wikipedia)
* cplusplus.com
* koders.com
* Hot scripts

 

Ders 2: Veri Tipleri, Değişkenler ve Sabitler

###################- (%95)

En son güncelleme: Wed, 30 Nov 2011 13:22:02 +0200

Giriş

Orta ve yüksek seviyeli dillerin hemen hemen hepsinde veri tipi ve değişken kavramı bulunmaktadır. Bu kısımda C programlama dilindeki temel veri tipleri, tanımlayıcılar, değişkenler ve sabitler konu edilecektir.


2.1   Veri Tipleri

Veri tipi (data type) program içinde kullanılacak değişken, sabit, fonksiyon isimleri gibi tanımlayıcıların tipini, yani bellekte ayrılacak bölgenin büyüklüğünü, belirlemek için kullanılır. Bir programcı, bir programlama dilinde ilk olarak öğrenmesi gereken, o dile ait veri tipleridir. Çünkü bu, programcının kullanacağı değişkenlerin ve sabitlerin sınırlarını belirler. C programlama dilinde dört tane temel veri tipi bulunmaktadır. Bunlar:

      char
      int
      float
      double
Fakat bazı özel niteleyiciler vardır ki bunlar yukarıdaki temel tiplerin önüne gelerek onların türevlerini oluşturur. Bunlar:
      short
      long
      unsigned

Bu niteleyiciler sayesinde değişkenin bellekte kaplayacağı alan isteğe göre değiştirilebilir. Kısa (short), uzun (long), ve normal (int) tamsayı arasında yalnızca uzunluk farkı vardır. Eğer normal tamsayı 32 bit (4 bayt) ise uzun tamsayı 64 bit (8 bayt) uzunluğunda ve kısa tamsayı 16 biti (2 bayt) geçmeyecek uzunluktadır. İşaretsiz (unsigned) ön eki kullanıldığı taktirde, veri tipi ile saklanacak değerin sıfır ve sıfırdan büyük olması sağlanır. İşaretli ve işaretsiz verilerin bellekteki uzunlukları aynıdır. Fakat, işaretsiz tipindeki verilerin üst limiti, işaretlinin iki katıdır.

 NOT
Kısa ve uzun tamsayı tutacak tanımlayıcılar için int anahtar kelimesinin yazılmasına gerek yoktur.
     short s;  /* short int s; anlamında */
     long k;   /* long int k;  anlamında */

Bir C programı içerisinde, veri tiplerinin bellekte kapladığı alan sizeof operatörü ile öğrenilebilir. İlgi cekici olan, bu alanların derleyiciye ve işletim sistemine bağlı olarak değişiklik göstermesidir. Program 2.1'de, sizeof operatörü kullanılarak, veri tiplerinin bellek uzunlularının nasıl ekrana yazdırılacağı gösterilmiştir. Programın çıktısı, farklı derleyiciler ve işletim sisteminde denendiğinde bu durum daha iyi anlaşılır. Lütfen inceleyin.

Program 2.1: Değişken tipleri ve türevlerinin bellekte kapladıkları alanlar
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
/* 02prg01.c : sizeof operatörünün kullanımı */

#include <stdio.h>

main()
{
  printf( "char           : %d bayt\n", sizeof(char));
  printf( "short          : %d bayt\n", sizeof(short));
  printf( "int            : %d bayt\n", sizeof(int));
  printf( "long           : %d bayt\n", sizeof(long));
  printf( "unsigned char  : %d bayt\n", sizeof(unsigned char));
  printf( "unsigned short : %d bayt\n", sizeof(unsigned short));
  printf( "unsigned int   : %d bayt\n", sizeof(unsigned int));
  printf( "unsigned long  : %d bayt\n", sizeof(unsigned long));
  printf( "float          : %d bayt\n", sizeof(float));
  printf( "double         : %d bayt\n", sizeof(double));
  printf( "long double    : %d bayt\n", sizeof(long double));
}

ÇIKTI
Windows (32 bit) Turbo C Windows (32 bit) Salford Linux (32 bit) GCC Linux (64 bit) GCC
char           : 1 bayt
short          : 2 bayt
int            : 2 bayt
long           : 4 bayt
unsigned char  : 1 bayt
unsigned short : 2 bayt
unsigned int   : 2 bayt
unsigned long  : 4 bayt
float          : 4 bayt
double         : 8 bayt
long double    : 10 bayt
char           : 1 bayt
short          : 2 bayt
int            : 4 bayt
long           : 4 bayt
unsigned char  : 1 bayt
unsigned short : 2 bayt
unsigned int   : 4 bayt
unsigned long  : 4 bayt
float          : 4 bayt
double         : 8 bayt
long double    : 10 bayt
char           : 1 bayt
short          : 2 bayt
int            : 4 bayt
long           : 4 bayt
unsigned char  : 1 bayt
unsigned short : 2 bayt
unsigned int   : 4 bayt
unsigned long  : 4 bayt
float          : 4 bayt
double         : 8 bayt
long double    : 12 bayt
char           : 1 bayt
short          : 2 bayt
int            : 4 bayt
long           : 8 bayt
unsigned char  : 1 bayt
unsigned short : 2 bayt
unsigned int   : 4 bayt
unsigned long  : 8 bayt
float          : 4 bayt
double         : 8 bayt
long double    : 16 bayt

int veritipi ve türevleri ile hesaplanabilecek en küçük ve en büyük tamsayılar için aşağıdaki formül kullanılabilir:

Alt sınır = -28*sizeof(tip)
Üst sınır = 28*sizeof(tip)-1
Örneğin 4 baytlık bir int tipi için:
Alt sınır = -28*sizeof(int) = -232 = -2147483648
Üst sınır = 28*sizeof(int)-1 = 232-1 = 2147483647

Tablo 2.1'de bütün tipler, bellekte kapladıkları alanlar ve hesaplanabilcek (bellekte doğru olarak saklanabilecek) en büyük ve en küçük sayılar listelenmiştir.

Tablo 2.1: Değişken tipleri ve bellekte kapladıkları alanlar

Veri Tipi Açıklama Bellekte işgal ettiği boyut (bayt) Alt sınır Üst sınır
char Tek bir karakter veya
küçük tamsayı için
1 -128 127
unsigned char 0 255
short int Kısa tamsayı için 2 -32,768 32,767
unsigned short int 0 65,535
int Tamsayı için 4 -2,147,483,648 2,147,483,647
unsigned int 0 4,294,967,295
long int Uzun tamsayı için 8  -9,223,372,036,854,775,808 9,223,372,036,854,775,807
unsigned long int 0  18,446,744,073,709,551,615
float Tek duyarlı gerçel sayı için (7 basamak) 4 -3.4e +/- 38 +3.4e +/- 38
double Çift duyarlı gerçel sayı için (15 basamak) 8 -1.7e +/- 308 +1.7e +/- 308

2.2   Değişkenler

Değişkenler bilgisayarın geçici belleğinde bilginin saklandığı gözlere verilen sembolik adlardır. Bir C programında, bir değişken tanımlandığında bu değişken için bellekte bir yer ayrılır. Her değişkenin tuttuğu değerin nasıl bir veri olduğunu gösteren (önceki bölümde anlatılan) bir veri tipi vardır [1], [3].

C programlama dilinde, değişkenler ve sabitler programın başında bulunmalıdır. Bazı uygulamalarda değişkenin bir başlangıç değerinin olması istenir. Böyle durumlarda değişken bildirilirken başlangıç değeri verilebilir. Örneğin:

      char isim='X', z;    /* değer atamak zorunlu değil */
      int  sayi=0, n;
      float toplam=0.0, sonuc=22.14;

Değişken isimleri verirken bazı kurallara uymak zorunludur. Bunlar:

  • Değişken adları en fazla 32 karakterden oluşabilir. 32 karakterden uzun değişken adları ilk 32 karakteri değerlendirilir. Geriye kalan karakterler işleme tabi tutulmaz.
  • Değişken adları ingiliz alfabesinde bulunan karakterler (A-Z) veya (a-z) yada rakamlar (0-9) ile yazılmalıdır. Türkçe karakterler, özel karakter veya boşluk karakteri kullanılamaz.
  • Değişken adları herhangi bir rakam ile başlayamaz. Ilk karakter bir harf olamalıdır. Sonrakiler rakamlardan oluşabilir.
  • Aşağıda verilen kelimeler ANSI C 'nin anahtar kelimeleridir (key words) ve değişken ismi olarak kullanılamaz.
    
       auto       double   int        struct 
       break      else     long       switch
       case       enum     register   typedef
       char       extern   return     union
       const      float    short      unsigned
       continue   for      signed     void
       default    goto     sizeof     volatile
       do         if       static     while
    

Bu kurallara göre aşağadaki değişken (sabit, fonksiyon) adlarının geçerliliğini inceleyiniz.

Değişken/Sabit/Fonksiyon/Yapı Adı   Geçerlilik   Açıklama
asal   geçerli   -
Momentum   geçerli   -
ivme   geçerli   -
olasilik   geçerli   -
IsikHizi   geçerli   -
isik_hizi   geçerli   Alt çizgi karakteri   '_'   kullanılabilir
isik hizi   geçersiz   Boşluk karakteri kullanılamaz
ışık_hızı   geçersiz   Türkçe karakter kullanılamaz
1Bit   geçersiz   rakam ile başlanamaz
typedef   geçersiz   Anahtar kelimelerden birisi kullanılamaz

2.3   Sabitler

Sabit bildirimi, başlangıç değeri verilen değişken bildirimi gibi yapılır. Ancak, veri tipinin önüne const anahtar sözcüğü konmalıdır. Örneğin:

      const float   PI = 3.142857;
      const double  NOT= 12345.8596235489;
      const int     EOF= -1;
      const char[] = "devam etmek için bir tuşa basın...";

gibi sabit bildirimleri geçerli olup bunların içerikleri program boyunca değiştirilemez. Yalnızca kullanılabilir. Genellikle, sabit olarak bildirilen değişken isimleri büyük harflerle, diğer değişken isimlerinin ise küçük harflerle yazılması (gösterilmesi) C programcıları tarafından geleneksel hale gelmiştir.

Birçok C programında sabitler #define önişlemci komutu ile de tanımlandığını görebilirsiniz. Bu komutla sabit bildirimi, bir program parçasına ve makro fonksiyon tanımlaması yapılabilir. Bir program geliştirilirken simgesel sabitlerin kullanılması programın okunurluğunu arttırır ve bazen gerekli de olabilir. Aşağıda verilen simgesel sabit bildirimleri geçerlidir. #define önişlemcisi ile makro fonksiyon tanımalama işlemi, Bölüm 8 ve Bölüm 20'de anlatılacaktır.

  #define MAX     100
  #define DATA    0x0378
  #define YARICAP 14.22

2.4   Rakamsal Bilgiler

C programlama dili içinde tanımlanabilecek sabit rakamlar rakamsal bilgi (literal) olarak adlandırılır. Her veri tipi kendi rakamsal bilgisine sahiptir. Bu bilgiler, kaynak kod içerisinde, özel değerleri ifade eder. Örneğin aşağıdaki atama işleminde 25 ve 17.2 sayıları gibi:

   i = 25;    /* 25, int tipinde bir rakamsal bilgidir */
   r = 17.2;  /* 17.2, double tipinde bir rakamsal bilgidir */

C dilinde bütün tamsayı sabitler varsayılan (default) olarak int tipinde, gerçel sayı sabitler varsayılan olarak double tipindedir. Ancak sabitleri gösteren rakamların sonuna eklenecek U (veya u), L (veya l) ve F (veya f) harfleri ile bu durum değiştirilebilir. Bu yüzden, aşağıdaki atamalar aynı anlamda değildir.

    i = 25;    /* int           rakam */
    i = 25U;   /* unsigned int  rakam */
    i = 25L;   /* long int      rakam */
    i = 25UL;  /* unsigned long rakam */
    i = 25L;   /* long int      rakam */

    r = 17.2;  /* double        rakam */
    r = 17.2L; /* long double   rakam */
    r = 17.2F; /* float         rakam */

Tamsayı (int) rakamsal bilgiler, 8 (oktal) ve 16 (hexadesimal) sayı tabanında da gösterilebilir. Bunun için sabit rakamın başına, 8 tabanı için 0 (sıfır) ve 16 tabanını için 0x sembolleri eklenir. 16'lık sistemdeki hafler büyük (A, B, C, D, E ve F) veya küçük (a, b, c ,d, e ve f) olabilir. Buna gösterime göre, aşağıdaki atmalar aynı anlamadadır:

    i = 75;    /* i = 75, 10 tabanında */
    i = 0113;  /* i = 75,  8 tabanında */
    i = 0x4b;  /* i = 75, 16 tabanında */
    i = 0x4B;  /* i = 75, 16 tabanında */

Gerçel sayılar ondalıklı veya üstel olmak üzere iki biçimde gösterilebilir. Örneğin 123.456 sayısının aynı anlama gelen dört farklı gösterimi aşağıda verilmiştir. Üstel gösterimde, 1.23456e+2 veya 1.23456E+2 sayısı matematikteki 1.23456 x 102 gösterimi ile eşdeğerdir.

    x = 123.456;      /* ondalıklı gösterimi */
    x = 123.456e+0;   /* üstel gösterim */
    x = 1.23456e+2;   /* üstel gösterim */
    x = 1234.56E-1;   /* üstel gösterim */

Karakter sabitler, bir harf için tek tırnak, birden çok karakter için çift tırnak içinde belirtilirler.

    'A'               /* bir karakter */
    "Merhaba Dunya"   /* bir karakter kümesi */
Program 2.1'de, program içinde tanımlanan değişken sabitlerin ekrana nasıl yazdırılacağı gösterilmiştir.

Program 2.2: Değişkenlerin ve sabitlerin ekrana yazdırılması
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
/* 02prg02.c : Değişkenler ve sabitlerin ekrana yazdırılması */

#include <stdio.h>

#define PI 3.141593

int main()
{
  const int MAX = 100;
  char   c = 'a';
  char  *s = "Bu bir sicim";
  int    i = 22;
  float  f = 33.3;
  double d = 44.4;
 
  printf("PI = %lf\n",PI);
  printf("MAX= %d\n", MAX);
  printf("c  = %c\n", c);
  printf("s  = %s\n", s);
  printf("i  = %d\n", i);
  printf("f  = %f\n", f);
  printf("d  = %lf\n",d);

 return 0;
}

ÇIKTI

PI = 3.141593
MAX= 100
c  = a
s  = Bu bir sicim
i  = 22
f  = 33.299999
d  = 44.400000


2.5   Değişken Bildirim Yerleri ve Türleri

Yerel (local) Bildirim

Yerel değişkenler kullanıldığı fonksiyon içerisinde bildirilir. Yalnızca bildirildiği fonksiyon içerisinde tanınır ve kullanılabilir.

    int topla(int a,int b)
    {
    /* yerel (local) değişken c nin bildirimi */
     int c;
     c = a + b;
     return c;
   }

Genel (general) Bildirim

Genel değişkenler bütün fonksiyonların dışında bildirilir. Bir değişken program boyunca sürekli olarak kullanılıyorsa genel olarak bildirilmelidir.

   #include <stdio.h>

   void karesi();

   /*  m ve n global tip değişkendir. 
       Bu iki değişken tüm program boyunca kullanılmaktadır. */

   int m,n;  

   main()
   {
     m=7;
     karesi();
     printf("%d nin karesi %d dir",m,n);
   }

   void karesi(){
     n = m*m;
   }

2.6   Tip Dönüşümleri

Bir formül içerisinde bir çok değişken veya sabit olabilir. Bu değişken ve sabitler birbirinden farklı tipte olursa, hesap sonucunun hangi tipte olacağı önemlidir. Bir bağıntıda, içeriği dönüşüme uğrayan değişkenler eski içeriklerini korurlar. Dönüştürme işlemi için geçiçi bellek alanı kullanılır; dönüştürülen değer kullanıldıktan sonra o alan serbest bırakılır.

    char kr;
    int tam;
    long int ltam;
    unsigned int utam;
    short int stam;
    float f;
    double d;

bildirimlerine göre:

    Bağıntı      Sonuç Tipi
    -------      ----------
    kr+5         int
    kr+5.0       double
    d+tam        double
    f+d-2        double
    utam-tam     unsigned
    ltam*tam     long
    tam/2        int
    tam/2.0      double

 NOT
Tamsayılar arası bölme kesme hatalarına (truncation error) neden olur.
Bunun anlamı iki tamsayının oranı yine bir tamsayıdır.
örneğin: 4/2=2; ama 3/2=1 (1.5 değil).

Bir değişkenin sabit değerin veya bağıntının önüne tür veya takı (cast) yazılarak sonucun hangi tip çıkması istendiği söylenebilir. Genel yazım biçimi:

      (tür tipi)  bağıntı;
Örneğin:
      int x=9;
      float a,b,c;
      double d;
      ...
      a = x/4;
      b = x/4.0;
      c = (float) x/4;

işleminin sonucunda a değişkenine 2.0, b ve c değişkenlerine 2.25 değeri aktarılır. Yani 9/4 ile 9/4.0 farklı anlamdadır.



Powered by PHP