1. Reklam


    1. joysro
      ledas
      jungler
      keasro
      zeus
      karantina

C Püf Noktaları.


  1. Narqotic

    Narqotic Bilgiliyim rank8

    Kayıt:
    22 Nisan 2007
    Mesajlar:
    1.365
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    Meslek:
    !!!
    Şehir:
    BeN SeNiN CaNıN İçİN ÖmRüMü BiR KiBRiTiN KaBıNDa T
    void function1(void);
    void funciton2();

    int main()
    {

    char ch = 'a';
    function1();
    function2(33, ch);
    return 0;

    }
    void function1(void)
    {
    printf("In function1\n");
    }

    void function2()
    {
    printf("In function2\n");
    }


    void function1(void);
    void function2();

    fonksiyon prototipleri arasındaki fark nedir?
    Parametresi void olarak belirlenmiş bir fonksiyon, C dili standartlarına göre hiçbir parametre almaz.

    Parametre parantezlerine hiçbir değer girilmemiş fonksiyon ise, parametre kontrolünün yapılmayacağı anlamına gelir. Yani bu fonksiyon çağrılırken istenilen türde ve sayıda parametre alabilir. Tür ve parametre sayı kontrolü yapılmaz..

    int main()
    {

    int a=1;
    switch(a)
    {
    int b=20;
    case 1:
    printf("b is %d\n",b);
    break;
    default:
    printf("b is %d\n",b);
    break;
    }
    return 0;

    }


    Bu kodda ise, ekrana " b is 20" yazılmasını bekleyeceksiniz. Ancak 20 yerine çok tuhaf bir sayı gelecektir. Neden?

    switch bloğu içinde yeni bir değişken tanımlanıp ilk değer verilmiştir. Bu tamamen hatalı bir durumdur. switch bloğunun dışında tanımlanıp yine switch bloğu içerisinde değer atanırsa yine ekrana istenilen değer yazılmayacaktır.

    Yapılması gereken, int b = 20; ifadesi switch bloğunun dışında bildirilmelidir.
    #define SIZE 10

    void size(int arr[SIZE])
    {
    printf("size of array is:%d\n", sizeof(arr));
    }

    int main()
    {
    int arr[SIZE];
    size(arr);
    return 0;
    }


    Burada ise yapılmak istenen arr dizisinin kaç bitlik boyut kapladığını bulmaktır. Beklenen cevap integer türünün 4 bit olarak tutulduğu sistemlerde 40'tır. Ancak bu soruda cevap 4 olacaktır.

    Sebep? size() fonksiyonuna parametre olarak geçirilen arr, sadece bir göstericidir. Yani bu fonksiyon o göstericinin boyutunu hesaplar. Ekrana çıkan 4 sonucu, bir integer sabiti gösteren göstericinin boyutudur.

    int main()
    {

    char c;
    scanf("%c",&c);
    printf("%c\n",c);

    scanf(" %c",&c);
    printf("%c\n",c);

    system("pause");
    return 0;

    }


    İlk scanf fonksiyonunun kullanımı ile ikinci scanf fonksiyonunun kullanımı arasındaki farkı görebildiniz mi? 1. kullanım doğru iken, 2.sinde küçük bir bug var. Yani scanf(" %c", &c) ifadesinde, % karakterinden önce bir boşluk bırakılmış. Bu boşluğun scanf tarafından yorumlanışı bizim istemediğimiz bir şekilde olacaktır. Yani bir karakter girdiğimizde onu alıp işlemeyecektir (boşluk yüzünden).

    Sonuç olarak, printf fonksiyonunda parametreler arasna istediğimiz kadar boşluk koyabiliriz. Bu boşluklar, değerlerin ekrana yazılmasında rol alır. Ancak scanf fonksiyonunda yanlışlıkla kullanılacak bir boşluk, girilen değerlerin sırasını alt-üst edecektir.

    int main()
    {

    int i;
    i = 10;
    printf("i : %d\n",i);
    printf("sizeof(i++) is: %d\n", sizeof(i++));
    printf("i : %d\n",i);
    return 0;

    }
    Burada ise sizeof(i++) ifadesi ile i değerinin bir artarak ikinci printf fonksiyonunda ekrana 11 değerinin yazılması beklenir. Ancak sizeof(i++), sizeof(++i) ve sizeof(i) aynı şekilde çalışır. Yani ++ operatörünün yan etkisi çalışmaz.

    #define PrintInt(expr) printf("%s : %d\n", #expr,(expr))
    int main()
    {

    int y = 100;
    int *p;
    p = (int*)malloc(sizeof(int));
    *p = 10;
    y = y/*p; /*dividing y by *p */;
    PrintInt(y);
    return 0;

    }


    Ekrana 10 yazılmasını beklerken 100 yazılıyor. Kodu dikkatlice incelerseniz, y = y/*p ifadesinde bir tuhaflık olduğunu göreceksiniz. Bu kodun bulunduğu satıra yazılan yorum sayesinde, *p değişkeni gözden kaçırılıyor. Yani yorum satırı y'den sonraki /* karakterleriyle başlıyor. Ve istenilen sonuç yerine y = y ifadesinin sonucu yazılıyor. Gösterici işaretinin ve yorum satırlarının kullanımına dikkat etmek gerek. Burada, / atomundan sonra bir boşluk verilerek bug düzeltilir.

    y = y / *p;