Forum
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");
}
10 saat, 4 dakika önce | 113726 |
| Expert C Programming / örnek soru
|
satırların ne iş yaptığı sorulmuyor. bu kodun çıktısı ve bu çıktının sebebi nedir?
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
soru açık: bu kodun çıktısı ne olur.
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.
C'de istisna fırlatılmaz.
ayrıca burada döngü de göremiyorum ben.
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
- xyzt
- Üye Oluş Tarihi 07-18-2009
- Toplam Mesaji 7
- Toplam Puanı 185
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.
bir programın çalışması için döngü şart mı? daha önce hiç Hello World! yazdırmadın mı?
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.
#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.
Çok teseekür ederim hemen bir derleyici ile sonucu deniyecegim .
ben Linux altında GCC ile derledim ama herhangi bir C derleyicisi işinizi görür herhalde.
kolay gelsin.
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.
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..
-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.