Forum

Expert C Programmin...
 
Bildirimler
Hepsini Temizle

Expert C Programming / örnek soru

17 Yazılar
5 Üyeler
0 Likes
552 Görüntüleme
(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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");

}
 

 

 
Gönderildi : 26/07/2009 03:52

(@ugurpek)
Gönderiler: 272
Reputable Member
 






 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.

 
Gönderildi : 26/07/2009 14:02

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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

 
Gönderildi : 26/07/2009 14:28

(@ugurpek)
Gönderiler: 272
Reputable Member
 

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


 

 
Gönderildi : 26/07/2009 14:41

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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

 
Gönderildi : 26/07/2009 15:09

(@sevimKrono)
Gönderiler: 22
Eminent Member
 

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.

 
Gönderildi : 29/07/2009 03:50

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

C'de istisna fırlatılmaz.

 
Gönderildi : 29/07/2009 13:49

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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

 
Gönderildi : 29/07/2009 18:03

(@Soner_Koca)
Gönderiler: 113
Estimable Member
 

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


 


 








 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.

 
Gönderildi : 29/07/2009 20:02

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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

 
Gönderildi : 29/07/2009 20:13

(@sevimKrono)
Gönderiler: 22
Eminent Member
 

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.

 
Gönderildi : 29/07/2009 20:57

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

#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.

 
Gönderildi : 29/07/2009 22:48

(@sevimKrono)
Gönderiler: 22
Eminent Member
 

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

 
Gönderildi : 30/07/2009 02:36

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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

 
Gönderildi : 30/07/2009 19:08

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

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.

 
Gönderildi : 30/07/2009 22:11

(@GokhanDOGAN)
Gönderiler: 780
Prominent Member
 

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..

 

 

 

 
Gönderildi : 31/07/2009 03:05

(@cozumpark)
Gönderiler: 16309
Illustrious Member Yönetici
Konu başlatıcı
 

-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.

 
Gönderildi : 31/07/2009 03:18

Paylaş: