Döngü Sorusu..?

Endorfin35+

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

Kod:
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: 188
Kod:
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 :)

Kod:
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;
Kod:
    while((*dest = *src) != '\0')
    {
        dest ++;
        src ++;
    }

Sonra kısaltma yapılarak artışlar while parantezi içine alınmış;
Kod:
 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)
Kod:
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...

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

Kod:
#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);

}
 

Forum istatistikleri

Konular
8,432
Mesajlar
138,352
Üyeler
3,340
Son üye
hcetky

Son kaynaklar

Son profil mesajları

mechanic ayhanarican mechanic wrote on ayhanarican's profile.
https://www.allmystery.de almanca biliyorsan burada araştır. Yapay zekada çeviriyor gerçi.
Almanların matematik bilgisi daha iyi oluyor.
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Back
Top