C Sınav Sorusu
-
#include <stdio.h>
#include <conio.h>
main(){
int i,j;
i=j=2,3;
while(--i&&j++)
printf("%d %d",i,j);
getch();
return 0;
}
Ekrana verilen çıktıyı,while'ın kaç kere döndüğünü,kaç kere doğruyu gösterdiğini sordu hoca. Ben sonsuz döngü diye düşündüm ama çıktı 1 3 şeklide çıkıyor.Nedenini açıklayabilen var mı?
-
ilk girişte j ve i int olduğu için 2.3 ün tam sayı kısmı olan 2 olurlar. Döngüye girmeden döngü kontrolünde i kontrol yapılmadan 1 eksiltilir yani 1 olur. J ise döngü kontrolü yapıldıktan sonra 1 arttırılır ve 3 olur. Daha sonra bunlar döngü içinde yazdırılır. Tekrar döngü kontrolüne gelinmeden önce i 1 azaltılır ve 0 olur. Döngü kontrolü yapıldığında i 0 olduğu için mantıksal FALSE değeri alır ve döngüye girmeden çıkar. Olay bundan ibaret.
Ekleme: 2,3'ü 2.3 olarak yanlış görmüşüm o yüzden açıklamam tam olarak doğru değil. 2,3 olunca soldaki değeri alıyor virgül operatöründen dolayı. Diğer açıklamalarımdaki gibi işlemler devam ediyor. @NMC açıklamış aşağıda.
DrKill tarafından 25/Nis/13 13:19 tarihinde düzenlenmiştir -
kpoya vermeyinb bırakın öğrensin çabalasın ibiş
-
HeadBanger bunu yazdı
kpoya vermeyinb bırakın öğrensin çabalasın ibiş
Hocam sen bırak TBT'yi "boş işlerle" uğraş bence.
Aynı sınava girdim sınavda çıkan bir soru başlığa bakarsan "Sınavdayım Acil Yardım Edin..." gibi bir başlık değil.
Kodu çalıştırıp baktık sonuç 1 3 çıkıyor.
Mantığını kavramak amacıyla soru sorduk.
-
DrKill bunu yazdı
ilk girişte j ve i int olduğu için 2.3 ün tam sayı kısmı olan 2 olurlar. Döngüye girmeden döngü kontrolünde i kontrol yapılmadan 1 eksiltilir yani 1 olur. J ise döngü kontrolü yapıldıktan sonra 1 arttırılır ve 3 olur. Daha sonra bunlar döngü içinde yazdırılır. Tekrar döngü kontrolüne gelinmeden önce i 1 azaltılır ve 0 olur. Döngü kontrolü yapıldığında i 0 olduğu için mantıksal FALSE değeri alır ve döngüye girmeden çıkar. Olay bundan ibaret.
şu ilk girişte 2.3 ondalık olarak mı aldınız?i'ye 2 j'ye 3 değerini atamak değil midir ordaki? Kalınla yazdıklarınızı anladım onda sıkıntı yok zaten ama şu döngünün durmasını anlamış değilim.Bu arada saol yardımın için.
@HeadBanger Diyecek lafım yok ...
mt93 tarafından 25/Nis/13 00:30 tarihinde düzenlenmiştir -
mt93 bunu yazdıDrKill bunu yazdı
ilk girişte j ve i int olduğu için 2.3 ün tam sayı kısmı olan 2 olurlar. Döngüye girmeden döngü kontrolünde i kontrol yapılmadan 1 eksiltilir yani 1 olur. J ise döngü kontrolü yapıldıktan sonra 1 arttırılır ve 3 olur. Daha sonra bunlar döngü içinde yazdırılır. Tekrar döngü kontrolüne gelinmeden önce i 1 azaltılır ve 0 olur. Döngü kontrolü yapıldığında i 0 olduğu için mantıksal FALSE değeri alır ve döngüye girmeden çıkar. Olay bundan ibaret.
şu ilk girişte 2.3 ondalık olarak mı aldınız?i'ye 2 j'ye 3 değerini atamak değil midir ordaki? Kalınla yazdıklarınızı anladım onda sıkıntı yok zaten ama şu döngünün durmasını anlamış değilim.Bu arada saol yardımın için.
@HeadBanger Diyecek lafım yok ...
integer yani tam sayı olarak aldığın için değişkenleri
bkz: int i, j;
küsürlü sayı yazsanda 2,3 gibi sadece tam sayı kısmını alır derleyici. Küsürlü şekilde almak istersen float veya benzer bir şekilde tanımlayacaksın i ve j değişkenlerini. -
mRBerkay bunu yazdımt93 bunu yazdıDrKill bunu yazdı
ilk girişte j ve i int olduğu için 2.3 ün tam sayı kısmı olan 2 olurlar. Döngüye girmeden döngü kontrolünde i kontrol yapılmadan 1 eksiltilir yani 1 olur. J ise döngü kontrolü yapıldıktan sonra 1 arttırılır ve 3 olur. Daha sonra bunlar döngü içinde yazdırılır. Tekrar döngü kontrolüne gelinmeden önce i 1 azaltılır ve 0 olur. Döngü kontrolü yapıldığında i 0 olduğu için mantıksal FALSE değeri alır ve döngüye girmeden çıkar. Olay bundan ibaret.
şu ilk girişte 2.3 ondalık olarak mı aldınız?i'ye 2 j'ye 3 değerini atamak değil midir ordaki? Kalınla yazdıklarınızı anladım onda sıkıntı yok zaten ama şu döngünün durmasını anlamış değilim.Bu arada saol yardımın için.
@HeadBanger Diyecek lafım yok ...
integer yani tam sayı olarak aldığın için değişkenleri
bkz: int i, j;
küsürlü sayı yazsanda 2,3 gibi sadece tam sayı kısmını alır derleyici. Küsürlü şekilde almak istersen float veya benzer bir şekilde tanımlayacaksın i ve j değişkenlerini.i=j=2,3;
Bu şekilde atama değerini ilk defa gördüm.Sınavda da nasıl düşündüysem yani hiç o şekil düşünemedim sıralı şekilde atamadır diye düşündüm.i=2,j=3 diye... Daha önce atamaların böyle yapıldığını biliyodum bu farklı bi gösterimdir diye düşündüm.Saolun...
-
mRBerkay bunu yazdımt93 bunu yazdıDrKill bunu yazdı
ilk girişte j ve i int olduğu için 2.3 ün tam sayı kısmı olan 2 olurlar. Döngüye girmeden döngü kontrolünde i kontrol yapılmadan 1 eksiltilir yani 1 olur. J ise döngü kontrolü yapıldıktan sonra 1 arttırılır ve 3 olur. Daha sonra bunlar döngü içinde yazdırılır. Tekrar döngü kontrolüne gelinmeden önce i 1 azaltılır ve 0 olur. Döngü kontrolü yapıldığında i 0 olduğu için mantıksal FALSE değeri alır ve döngüye girmeden çıkar. Olay bundan ibaret.
şu ilk girişte 2.3 ondalık olarak mı aldınız?i'ye 2 j'ye 3 değerini atamak değil midir ordaki? Kalınla yazdıklarınızı anladım onda sıkıntı yok zaten ama şu döngünün durmasını anlamış değilim.Bu arada saol yardımın için.
@HeadBanger Diyecek lafım yok ...
integer yani tam sayı olarak aldığın için değişkenleri
bkz: int i, j;
küsürlü sayı yazsanda 2,3 gibi sadece tam sayı kısmını alır derleyici. Küsürlü şekilde almak istersen float veya benzer bir şekilde tanımlayacaksın i ve j değişkenlerini.Kafanız mı güzel ya :) Hangi programlama dilinde virgül ondalık için kullanılmış? Küsürat için nokta kullanılır. Virgül operatördür, kullanımı için
http://msdn.microsoft.com/en-us/library/zs06xbxh.aspx bak buraya aşağı yukarı fikir verir right to left, left to right mantığı ile alakalı.
Sonuç olarak soldaki değeri aldığı için i ve j ye 2 atıyor daha sonra i yi bir azaltıp ( 1 ) j yi de 1 artırıyor ( 3 )
fakat --i ile i-- farklı şeylerdir. Mesela
i = 5
a = --i;
printf("%d %d",i,a); // 4 4 basarken
i = 5
a = i--;
printf("%d %d",i,a); // 5 4 basar
Sonuç olarak ilk döngü basamağında 1 ile 2 yi and işlemine sokuyosun ki sonucu 1dir. While devam eder. 2. dönüşte ise 0 ile 3ü and işlemine sokuyosun sonuç 0 o yüzden döngüden çıkıyor :)
Edit: Virgülü burda daha güzel anlatmış :) http://en.wikipedia.org/wiki/Comma_operator
NmC tarafından 25/Nis/13 00:12 tarihinde düzenlenmiştir -
hocam int i=j=2,3 dediğin zaman. integer yani tam sayı olarak i ve j tanımlamış, bu iki değişkeni de küsüratlı bi sayıya eşitlemiş oluyosun. yani sonuç olarak i de j de 2 oluyor. while döngüsünde --i yaptığı için i değişkeni 2 yerine 1 den başlıyor, j için de j++ dediğinden dolayı j değeri de 3 olarak başlıyor. && bağlacı olduğu için ikisinin de sağlanması lazım.
bu şekilde olması gerekir die düşünüyorum.
-
int den dolayı tam kısmını alır i=2; j =2; birini bir azaltıyor yani i=1; birini de bir artırıyor yani j =3 bu yüzden çıktı bu şekilde
-
Ya ısrarla niye herkes tam kısmı alır diyo ya.. Orda küsüratlı bir sayı yok küsürat nokta ile yazılır.
i=j=2,3,4,5,6;
yazılmış olsa ne yapacaktınız merak ediyorum :)