Döngü Sorusu..?

Endorfin35+

Kayıtsız Üye
Katılım
1 Mayıs 2020
Mesajlar
4,211
Şöyle bir kullanıma rastladım; string kopyalıyor.

C:
while(*dest++ = *src++);

ve doğru sırda yorumlayamadım.

src adresi 10, dest adresi 50 olsun...

*dest++ = *src ++

src deki datayı dest e kopyala, sonra ikisinide bir artır. Bu mümkünse sonuç true olur döngü koşulu devam eder tekrar sorgulanır. ee bu durum nasıl bozulur. Bu ifade nasıl çalışıyor...? Biri beni işlem operatör önceliği ile vs aydınlatabilir mi...

1627413780914.png
 

Ekler

  • 1627413626509.png
    1627413626509.png
    7.8 KB · Görüntüleme: 100
C:
int main()
{
    int a=5;
    int b=0;

    b=a++;
    printf("%d %d",a,b);
}

şöyle bir deneme yaparak işlem önceliğini anladım. Önce eşitleme sonra artırım yapılıyor. Bu tamam...

Peki dizinin bitiş karakteti '\0' kopyalanamaz bir karaktermi?
 
Oradaki işlem sonucu while döngüsünün şartı olarak kullanılıyor. Yani dest pointerinin işaret ettiği yerdeki data. Sıfır ile sonlanan bir diziyi, sondaki sıfır datası dahil kopyalar ve en son sıfırı kopyaladığında *dest sıfır olacağı için while döngüsü sonlanır.

Ama bu şekilde arap saçı gibi kod yazanlar genelde işi çok iyi bilmeyen, gösteriş meraklısı programcılar. Bu şekilde kod yazmanın hiçbir faydası olmaz. Hem okunması zordur, hem debug ederken adım adım çalıştırma zordur, hem de senin kodu devralan başka bir programcı tarafından bol bol kulakların çınlatılır :katil2:

Şöyle yazarsan bu kodu, hem aynı işi yapar, hem de üretitilen makina kodunun performansında belirgin hiçbir fark olmaz, hem de senden sonraki programcının duasını alırsın :)

C:
char a;
do
{
    a = *src++;
    *dest++ = a;
}
while (a != 0);
 
Son düzenleme:
Bende şöyle bir açıklama buldum;

Kısaltılma yapılamdan önceki hali şudur diyor;
C:
    while((*dest = *src) != '\0')
    {
        dest ++;
        src ++;
    }

Sonra kısaltma yapılarak artışlar while parantezi içine alınmış;
C:
 while((*dest++ = *src++) != '\0');

Son olarak derki 0 ile (koşul) karşılaştırma yapıldığından buna da gerek yoktur... (bunu tam anlamadım hala)
C:
while(*dest++ = *src++);



Şimdi
"while(1);" sonsuz döngüye girdiğimi biliyorum. "while (0);" ile döngünün çalışmadığını biliyorum...

ve aşağıdaki gibi bir deneme yaparak while ın soldaki değere göre çalıştığını (çalışmadığını) anladım...

C:
int main()
{
    int src=0;
    int dest=5;


    while(dest=src)
    {
        printf("Deneme");
    }
  
}


Sonuç : konuyu anladım. Klasik kodlamada işlem önceliğine bir şekilde aşinayız ve genelde aynı anda çok fazla işlem yok. (en fazla a +=1 gibi kısaltmalar görüyoruz) Fakat bu yukarıdaki kullanımı anlamak için işlem önceliğine iyi hakim olmak gerekiyormuş....

Kafa karıştıran bir başka şey ise while içinde koşul odaklı bakış açımız. "=" ataması ilk başta koşul gibi gelmişti bana... Aslında koşul orada değil sonuçta...
 
Son düzenleme:
bu arttırma işareti pointer(*) işaretini kapsamıyor sanırım.Kitapta şöle bir şey buldum yararlı olabilir.
103e5460-681d-43c3-8993-962751126654.jpg
 
Bende çalışan kodu örnek olması açısından ekleyeyim...

C:
#include<stdio.h>


void kopyala(char *hedef, char *kaynak)
{

   while(*hedef++ = *kaynak++);

}


int main()
{
    char dizi[30]="Merhaba";
    char yeni_dizi[30];

    kopyala(yeni_dizi, dizi);

    printf("%s",yeni_dizi);

}
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,982
Mesajlar
102,041
Üyeler
2,514
Son üye
evrenbasaran

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top