Expert C Programmin...
 
Bildirimler
Hepsini Temizle

Expert C Programming / örnek soru  

  RSS
CozumPark
(@cozumpark)
Onursal Üye Yönetici

aşağıdaki soruyu Expert C Programming kitabından uyarladım. küçük ama baş ağrıtabilecek bir nokta. forumda tartışılırsa herkes için faydalı olur düşüncesiyle foruma yazdım. aşağıdaki kodun çıktısı ne olur?tabi nedeni nedir diye de soruyoruz 🙂

#include <stdio.h>
int arr[ ] = { 1,2,3,4,5,6,7,8,9};
#define ARR_SIZE (sizeof(arr)/sizeof(arr[0]))
int main()
{
        int d = -1;
        if (d <= ARR_SIZE)
                printf("kucuk\n");
        else
                printf("buyuk\n");

}
 

 

Alıntı
Gönderildi : 26/07/2009 03:52
ugur pek
(@ugurpek)
Üye






 10 saat, 4 dakika önce 113726










Expert C Programming / örnek soru











aşağıdaki soruyu Expert C Programming kitabından uyarladım. küçük ama baş ağrıtabilecek bir nokta. forumda tartışılırsa herkes için faydalı olur düşüncesiyle foruma yazdım. aşağıdaki kodun çıktısı ne olur?tabi nedeni nedir diye de soruyoruz 🙂


#include <stdio.h>
int arr[ ] = { 1,2,3,4,5,6,7,8,9}; dizi tanımlanıyor
#define ARR_SIZE (sizeof(arr)/sizeof(arr[0])) sabit degişken dizinin boyutu
int main()
{
        int d = -1; d   degeri -1 veriliyor
        if (d <= ARR_SIZE) d dizideki elemanlardan küçükse küçüküyazdırıyor
                printf("kucuk\n");
        else
                printf("buyuk\n"); d dizideki elemanlardan büyükse büyük yazdırıyor


}
 


ayrıca tam hatırlamamakla birlikte diziye ulaşım için bir dögü kurulması gerekebilir.

CevapAlıntı
Gönderildi : 26/07/2009 14:02
CozumPark
(@cozumpark)
Onursal Üye Yönetici

satırların ne iş yaptığı sorulmuyor. bu kodun çıktısı ve bu çıktının sebebi nedir?

CevapAlıntı
Gönderildi : 26/07/2009 14:28
ugur pek
(@ugurpek)
Üye

satırların ne iş yaptığı sorulmuyor. bu kodun çıktısı ve bu çıktının sebebi nedir?


Ne demek istediğini anlayamadım hem çıktısını soruosun bizde sana böyle bölye olursa buyuk veya küçük diyoruz


sebebini kod satırlarının yanlarına  adımlarını söyleyerek açıklama yapılıyor hala muhalefet şekilde satırlar ne işe yaptıgı sorulmuyor diyorsun başka bir şey istiyorsan onu yaz demekki ne istediği iyi  ifade edememişsin


 

CevapAlıntı
Gönderildi : 26/07/2009 14:41
CozumPark
(@cozumpark)
Onursal Üye Yönetici

soru açık: bu kodun çıktısı ne olur.

CevapAlıntı
Gönderildi : 26/07/2009 15:09
sevim Krono
(@sevimKrono)
Üye

Bu tür döngülerde 2 seçenek oluyor ya 1 yada 0 sonucu alindigini dusunuyorum , tam emin olmamakla birlikte istisnai bir durum f1rlat1l1rsa o zaman sonsuz kümeyede ula_abiliyoruz. Genede sizden cvp icin sabirsizlikla beklemekteyim.

CevapAlıntı
Gönderildi : 29/07/2009 03:50
CozumPark
(@cozumpark)
Onursal Üye Yönetici

C'de istisna fırlatılmaz.

CevapAlıntı
Gönderildi : 29/07/2009 13:49
CozumPark
(@cozumpark)
Onursal Üye Yönetici

ayrıca burada döngü de göremiyorum ben.

CevapAlıntı
Gönderildi : 29/07/2009 18:03
Soner_Koca
(@Soner_Koca)
Üye

bu program alışmaz döngü yok. if bloğuna dizinin hangi elemanıyla karşılaştırma yapıyosun.döngü olduğunu varsayıp programın çalıştığınıda düşünürsek dizi eleman sayısı kadar kadar ekrana küçük yazar


 


 


[quote user="ugur pek"]







 10 saat, 4 dakika önce 113726










Expert C Programming / örnek soru











aşağıdaki soruyu Expert C Programming kitabından uyarladım. küçük ama baş ağrıtabilecek bir nokta. forumda tartışılırsa herkes için faydalı olur düşüncesiyle foruma yazdım. aşağıdaki kodun çıktısı ne olur?tabi nedeni nedir diye de soruyoruz 🙂


#include <stdio.h>
int arr[ ] = { 1,2,3,4,5,6,7,8,9}; dizi tanımlanıyor
#define ARR_SIZE (sizeof(arr)/sizeof(arr[0])) sabit degişken dizinin boyutu
int main()
{
        int d = -1; d   degeri -1 veriliyor
        if (d <= ARR_SIZE) d dizideki elemanlardan küçükse küçüküyazdırıyor
                printf("kucuk\n");
        else
                printf("buyuk\n"); d dizideki elemanlardan büyükse büyük yazdırıyor


}
 


ayrıca tam hatırlamamakla birlikte diziye ulaşım için bir dögü kurulması gerekebilir.

[/quote]

CevapAlıntı
Gönderildi : 29/07/2009 20:02
CozumPark
(@cozumpark)
Onursal Üye Yönetici

bir programın çalışması için döngü şart mı? daha önce hiç Hello World! yazdırmadın mı?

CevapAlıntı
Gönderildi : 29/07/2009 20:13
sevim Krono
(@sevimKrono)
Üye

C  sadece mantık açısından bakıyorum ve bir mantık yürüttüm , cevabınızı da sabırsızlıkla bekliyorum. Uzmanlığım farklı ve sadece amacım bilmediğim konularda ne kadar başarılıyım denemektir.

CevapAlıntı
Gönderildi : 29/07/2009 20:57
CozumPark
(@cozumpark)
Onursal Üye Yönetici

#define ARR_SIZE (sizeof(arr)/sizeof(arr[0]))

burada bir makro
tanımlanıyor ve bu makronun değeri de arr dizisinin eleman sayısı
oluyor(yani . sizeof operatorunun sonucu unsigned integer olduğu için ARR_SIZE'ın tipi de unsigned integer olmuş oluyor şu durumda.

devam edersek,

d değişkeni bir signed integer olduğu için  negatif ve pozitif değerler alabiliyor, burada -1 değeri verilmiş.

sonra if'e girildiğinde d değişkeni ile ARR_SIZE karşılaştırılıyor. ancak burası önemli:

signed
integer olan d değişkeni unsigned integer olacak şekilde dahili
dönüştürme yapılıyor biz farkında olmadan(galiba 2's complement
yapılıyor). dolayısıyla sayı -1 iken, bu dönüştürme sonunda sistemdeki
maximum integer değerine ulaşıyor, yani bir nevi ters dönüyor.

dolayısıyla -1< 9 olmasını beklerken, bu beklenilen gerçekleşmiyor ve sonucta "buyuktur" yaziyor.

 

şunu deneyerek daha iyi anlayabilirsiniz:

#include<stdio.h>
int main()
{
        printf("%u",-1);
}

benim sistemimde sonuç:

 4294967295

buradaki %u, unsigned integer için format parametresidir.  bu printf'in sonucunda beklemediğiniz bir sonuçla karşılacaksınız. bunun sebebi yukarıda anlattığım gibi singed integer'ın unsigned integer'a çevrilmesidir.

 

açıklayabildim inşallah.

CevapAlıntı
Gönderildi : 29/07/2009 22:48
sevim Krono
(@sevimKrono)
Üye

Çok teseekür ederim hemen bir derleyici ile sonucu deniyecegim .

CevapAlıntı
Gönderildi : 30/07/2009 02:36
CozumPark
(@cozumpark)
Onursal Üye Yönetici

ben Linux altında GCC ile derledim ama herhangi bir C derleyicisi işinizi görür herhalde.
kolay gelsin.

CevapAlıntı
Gönderildi : 30/07/2009 19:08
CozumPark
(@cozumpark)
Onursal Üye Yönetici

ayrıca:
#define ISUNSIGNED(a) (a >= 0 && ~a >= 0)
makrosunu incelemek konuyu daha iyi anlamaya yardımcı olur bence.
NOT:
~ operatörü sayının "değilini" alır.işaret biti yoksa bu "değil alma" işlemi sayının işaretini değiştirmez.

CevapAlıntı
Gönderildi : 30/07/2009 22:11
Gokhan DOGAN
(@GokhanDOGAN)
Üye

Merhaba

Sayın xyzt ek olarak

sizeof ile hafızada değişkenin byte değerini alır dizi 0 dan başar ve bir int 4 byte 4*9=36 byte /4=9 

buradaki if de görünen -1<=9 true değeri dönmesi gerekir gözüken ama -1 i compiler comt. işlemi yapıp alacağı max değeri atar buda max<=9 a false dönüp büyüktür e girer. d ye poizitif bir sayı verdiğinde ise bu kez tam tersi olup min alır. define sabitini  main içinde bir int olarak tanımlarsanız bu iki aynı tipi karşılaştırır ve normal gözüken değeri döner..

 

 

 

CevapAlıntı
Gönderildi : 31/07/2009 03:05
CozumPark
(@cozumpark)
Onursal Üye Yönetici

-1 değeriyle ARR_SIZE ın değeri karşılaştırılıyor if'in içinde. ARR_SIZE  unsigned integer tipinde olduğu için, -1'i unsigned integer'a çeviriyor. bunu yaparken -1 değerine 2's complement işlemini uyguluyor, haliyle sayının bitleri terslendiği için sayı büyüyor.

burada önemli olan ARR_SIZE ın nerede tanımlandığı değil, tipinin ne olduğu ( yani burada unsigned integer ) bence.. ve hatayı yakalamaktaki zorluk da dahili dönüştürme yapılmasından kaynaklanıyor. biz farkında bile olmadan dönüştürülme yapılmış oluyor.

CevapAlıntı
Gönderildi : 31/07/2009 03:18
Paylaş: