Gönderen Konu: C Programlama diliyle şamatalar  (Okunma sayısı 183739 defa)

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1943
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1050 : 30 Eylül 2017, 05:51:34 »
Yanlış değil.
Ona blok açmak deniyordu sanırım.

"C ile Programlama Prof.Dr.Mitat Uysal"
2.Baskı Sayfa 209

Kısaca değişken tanımlandığı blok dışında kullanılamaz.
« Son Düzenleme: 30 Eylül 2017, 05:56:24 Gönderen: baran123 »

Çevrimdışı vitruvius

  • Emektar
  • *****
  • İleti: 836
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1051 : 30 Eylül 2017, 06:06:34 »
Merhabalar, C'nin hangi türüne mutaassıp olduğunu bilmiyorum ama şu tür bir yazım ile karşılaştım ne anlama geliyor, ne amaçla kullanılıyor bilmiyorum. Aşağıda buluna kod parçasında parantezler ne bir if ne de herhangi bir döngü için kullanılmış bu süslü parantezlerin kullanım amacı nedir ?

Kod: [Seç]
int16_t data;
{
int16_t data;   
data = 3;
}

Scope yaratmada kullanilir. Bazen belli degiskenlerin kisa omurlu olsun, bir scope icinde kalsin isteyebilirsin.

Misal:

Kod: [Seç]
#include "stdio.h"

int main()
{
  int num = 0;
  printf("num: %d\n", num);
  {
    int num = 0;
    num = 5;
    printf("num: %d\n", num);
  }
  printf("num: %d\n", num);
}

Bu kod parcasi asagidaki ciktiyi verecektir:
Kod: [Seç]
num: 0
num: 5
num: 0

Farkettiysen 5 degerini atadigimiz "num" degiskeni scope'un disina ciktiginda ucup gitti.

Ayni kodu asagidaki gibi degistirirsek:
Kod: [Seç]
#include "stdio.h"

int main()
{
  int num = 0;
  printf("num: %d\n", num);
  {
    int num1 = 0;
    num = 5;
    printf("num: %d\n", num);
  }
  printf("num1: %d\n", num1);
}

Soyle bir hata alirsin:
Kod: [Seç]
aaa.c:12:24: error: use of undeclared identifier 'num1'; did you mean 'num'?
  printf("num1: %d\n", num1);
                       ^~~~
                       num
aaa.c:5:7: note: 'num' declared here
  int num = 0;
      ^

Burada kendi olusturdugumuz kucuk scope icinde "num" degiskenine erisip onu degistirmekte sorun yok. Ancak, en sondaki printf "num1"in degerini yazmaya calisiyor. C dilinde degiskenler tanimli olduklari scope araliginda varolurlar. Yani buradaki hata "num1"e scope disinda erismeye calismak.

Tabi verdigin kod cok eski bir kod ise pre-ANSI C donemlerinde baska bir kullanimi daha var {}'in ama bosuna kafa sisirmeyelim :)

Çevrimdışı unknownperson

  • Kıdemli
  • ****
  • İleti: 406
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1052 : 30 Eylül 2017, 06:28:03 »
Çok iyi anlatmışsınız aslında kodu biraz salladım başka bir yerde görmüştüm bu iki parantez arası işlem yaptırıyordu. Ben de sizin dediğiniz gibi tahmin etmiştim parantezler arası tanımlı oluyor diye. Fakat bu dediğim süslü parantezler sık kullanılıyor genelde main boardlarda. Sizin dediğinize göre sanırım sadece o parantezler arası tanımlı olduğundan oradan çıkınca değer uçuyor ve az hafıza kullanıyor şeklinde yani az alan kapsaması için mi kullanılıyor ? Yoksa başka amaçlar içinde kullanılabilir mi mesela pre-ANSI C 'den az bahsedebilir misiniz ?

Çevrimdışı vitruvius

  • Emektar
  • *****
  • İleti: 836
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1053 : 30 Eylül 2017, 07:47:31 »
Evet bir degiskenin run-time omrunu azaltmak icin scope kullanabilirsin/kullanmalisin. Scope disina ciktiginda stack'ten silinirler. Boylece RAM'den birazcik kar edersin :)

Ya da ayni kod parcasini ya da degisken ismini tekrar kullanmak istiyorsan o kod parcasini/degisken tanimlamasini kopyalayip {} icine koyabilirsin. Boylece bir sikinti olmaz.

Yanlis hatirlamiyorsam pre-ANSI C'de fonksiyonlar soyle tanimlaniyordu.

Kod: [Seç]
int sum(a, b)
int a;
int b;
{
    return a+b;
}

Soyle de bir durum var C99 standardi oncesinde kafana gore bir yerde degisken tanimlayamazsin. Bir scope'un en basinda tanimlaman gerekir.

Mesela asagidaki kodu C90 standardi ile derleyelim:
Kod: [Seç]
int main()
{
  int x1 = 1;
  x1 = 5;
  int x2 = 3;
  printf("Sum: %d\n", x1 + x2);
  return 0;
}

Asagidaki gibi bir uyari aliriz:
Kod: [Seç]
aaa.c:7:7: error: ISO C90 forbids mixing declarations and code [-Werror,-Wdeclaration-after-statement]
  int x2 = 3;
      ^

Ama bir scope olusturup bunun en basinda tanimlarsan bir sorun olmaz. Bu arada scope olusturmak icin illa basi bos {} yapmaya gerek yok. Bir if{} de bir scope'dur, bir while(){} da.

Kodu asagidaki gibi degistirelim:
Kod: [Seç]
int main()
{
  int x1 = 1;
  x1 = 5;

  if (x1 >5) {
    int x2 = 3;
    printf("Sum: %d\n", x1 + x2);
  }
  return 0;
}

Gordugun gibi burada if ile bir scope olusturup, en basinda degiskenimi tanimladim. Derleyince herhangi bir hata vermedi. He bana inanmaz da kendin derlemek istersen :) ve gcc kullaniyorsan:

Kod: [Seç]
--pedantic-errors
flag'i ile derlemen gerekir. Yoksa gcc'yi C80-90 standardi kullanmaya zorlayamazsin.

Çevrimdışı unknownperson

  • Kıdemli
  • ****
  • İleti: 406
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1054 : 30 Eylül 2017, 08:13:42 »
Çok çok yararlı oldu @vitruvius hocam, anlatım için teşekkür ederim  :D

Çevrimdışı F493

  • Emektar
  • *****
  • İleti: 523
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1055 : 30 Eylül 2017, 12:08:46 »
Yanlış yere yazıldı.
« Son Düzenleme: 30 Eylül 2017, 12:10:35 Gönderen: F493 »
Sırtındaki kocaman damlaya rağmen tutunmaya çalışan Uğur böceği.

Çevrimdışı foseydon

  • Müdavim
  • ***
  • İleti: 84
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1056 : 27 Ekim 2017, 08:48:24 »
yeni birşey daha öğrenmiş oldum. Ama bu nasıl kullanılır pek aklım kesmedi işin açığı.

Çevrimdışı unknownperson

  • Kıdemli
  • ****
  • İleti: 406
Ynt: C Programlama diliyle şamatalar
« Yanıtla #1057 : 14 Kasım 2017, 07:54:46 »
-
« Son Düzenleme: 14 Kasım 2017, 09:04:55 Gönderen: unknownperson »