Derlenen kod C++ döngüsünü görmüyor

Katılım
8 Mayıs 2024
Mesajlar
10
Daha fazla  
Cinsiyet
Kadın
Kod:
int main(){
    int dizi[5];
    int i;
    printf("%s%15s","Element","Value");
    i=0;
    while(dizi[i])
    {
           
            dizi[i]=2+2*i;
            printf("%3d%17d",i+1,dizi[i]);
            i++;
    }
    printf("jhfjg");
   
   
   
    return 0;
}
 
Ne yapmaya çalışıyorsunuz? Bu döngünün bir anlamı yok. O yüzden sonsuz döngü dönüyor. Bir de böyle bir şey için for döngüsü öneririm.
 
Ne yapmaya çalışıyorsunuz? Bu döngünün bir anlamı yok. O yüzden sonsuz döngü dönüyor. Bir de böyle bir şey için for döngüsü öneririm.
element value
1 2
2 4
3 6
4 8
5 10
bunu yazdırmaya çalışıyorum for döngüsü de denedim aynı şekilde döngüyü es geçti sonda ki printf i sadece döngüyü mü atlıyo yoksa döngüden sonrasını hiç mi okumuyo bunu görmek için
 
Kod:
#include <stdio.h>
int main(){
    int dizi[5];
    int i;
    int value=2;
    printf("Element Value\n");
    for(i=1;i<6;i++){
        
        printf("%d %d\n",i,value);
        value+=2;
        
        
        
    }
    
}

for loopuna koyman daha iyi olur ben C'de yazdım ama C++ da da çalışması gerek

Element = i
value=value zaten
for loopun içinde her seferinde 1 artarken value da 2 artıyor.
diziyi de gerek yokmuş sonradan farkettim silmedim.
 
Yanlış...
C:
#include <stdio.h>
#define N 5

int main(void) {
    int dizi[N];
    printf("element value\n");
    int i = 0;

    for(int i = 1; i <= N; i++) {
        dizi[i - 1] = i * 2;
        printf("%3d %7d\n", i, dizi[i - 1]);
    }
    return 0;
}
 
  1. C:
    int dizi[5];
    Bu tanımlamayı bir fonksiyonun içinde yaptığınız sürece, dizinin içindeki elemanların değerlerinin rastgele olacağını düşünebilirsiniz. Bu, derleyiciden derleyiciye değişen bir durum olabilir. Detaylarını çok bilmiyorum.

  2. C:
    while (dizi[i]) {
        // ...
    }
    while(dizi[i]), while(dizi[i] != 0)'a denktir (int için). Elemanlarının değerlerinin ne olduğunu bilmediğimiz bir dizi için böyle bir koşula güvenmemeliyiz. Ayrıca i >= 5 olduğunda dizinin aralığı dışında kalan bir elemana erişmeye çalışırız, sağlıklı değil.

  3. Bir dizinin elemanlarını gezmek istediğimizde dizinin eleman sayısına yani uzunluğuna dayalı bir döngü oluşturmak isteriz:
    C:
    while(i < 5) {
        ...
    }

  4. while yerine for döngüsü daha anlaşılır olacaktır çünkü i ne olursa olsun artıyor:
    C:
    for(int i = 0; i < 5; i++) {
        // ...
    }
    Bazı -eski- derleyiciler int i;'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.

  5. printf'lerde yeni satıra geçmeleri unutmuşsunuz, şöyle yaparsanız çıktı istediğiniz gibi gözükecektir:
    1. printf("%s%15s\n", "Element", "Value");
    2. printf("%3d%17d\n", i + 1, dizi[i]);
  6. Dizinin boyutunu bir sabite atayıp kod boyunca bu sabiti kullanmak daha uygun olacaktır. Bunun getireceği kolaylık, dizinin eleman sayısını değiştirmek istediğimizde tek yerde değişiklik yapmamızın yetmesi olur. @TheAny'nin sunduğu koddaki gibi #define kullanabilirsiniz veya const int N = 5; falan da diyebilirsiniz.
 
Bazı -eski- derleyiciler int i;'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.
GCC 5+'den beri, GCC 5 öncesinde de C11 ve C99 ile destekliyor. Aşağıdaki GCC 4.9.2 flagsiz derleme sonucu;
1715215229470.png

C11 seçeneğini ekleyince derliyor sorunsuz.

GCC 5.1 flagsiz derleme sonucu;
1715215318287.png

clang ile deneyebildiğim en eski sürüm 3.4 oldu, onda da başarılı derliyor. MSVC içinde 19 öncesi sürüm test edemedim. 19'da da başarılı derliyor.

Bu tanımlamayı bir fonksiyonun içinde yaptığınız sürece, dizinin içindeki elemanların değerlerinin rastgele olacağını düşünebilirsiniz. Bu, derleyiciden derleyiciye değişen bir durum olabilir. Detaylarını çok bilmiyorum.
Doğru. Uninitialized olduğu için rastgele geliyor. int dizi[N] = {}; dediğinde hepsini boş başlatacak. GCC, Clang ve MSVC'de denedim. Hepsinde de derledi.
 
Son düzenleme:
For döngüsü de denedim, aynı şekilde döngüyü es geçti.

Asıl noktaya değinmeyi unutmuşum: Dizinizin elemanları, rastgele değerlere sahip. İlk eleman olan dizi[0] == 0 olduğu zaman döngünüzün şartı hemen bozuluyor.

Uninitialized olduğu için rastgele geliyor.

İlginç bir rastgelelik mevcut. Örneğin kendi bilgisayarımda gcc 13.2.0 mevcut, dizim 5 elemanlıyken dizinin elemanlarını bastırdığımda hep şu sonucu elde ediyorum: 0 0 36 0 0. Arka planda neler döndüğünü bilmiyorum. : D Hep aynı ve üzerine yazılmayan bir adrese falan mı denk geliyor acaba?
 
İlginç bir rastgelelik mevcut. Örneğin kendi bilgisayarımda gcc 13.2.0 mevcut, dizim 5 elemanlıyken dizinin elemanlarını bastırdığımda hep şu sonucu elde ediyorum: 0 0 36 0 0. Arka planda neler döndüğünü bilmiyorum. : D Hep aynı ve üzerine yazılmayan bir adrese falan mı denk geliyor acaba?
Mümkün. Stack allocation sırasında nereye denk gelirse oranın içindeki değeri veriyor. Genelde başka bir programın yada senin programının daha önceden bıraktığı bir şey olabiliyor. Undefined behavior.
 
  1. C:
    int dizi[5];
    Bu tanımlamayı bir fonksiyonun içinde yaptığınız sürece, dizinin içindeki elemanların değerlerinin rastgele olacağını düşünebilirsiniz. Bu, derleyiciden derleyiciye değişen bir durum olabilir. Detaylarını çok bilmiyorum.

  2. C:
    while (dizi[i]) {
        // ...
    }
    while(dizi[i]), while(dizi[i] != 0)'a denktir (int için). Elemanlarının değerlerinin ne olduğunu bilmediğimiz bir dizi için böyle bir koşula güvenmemeliyiz. Ayrıca i >= 5 olduğunda dizinin aralığı dışında kalan bir elemana erişmeye çalışırız, sağlıklı değil.

  3. Bir dizinin elemanlarını gezmek istediğimizde dizinin eleman sayısına yani uzunluğuna dayalı bir döngü oluşturmak isteriz:
    C:
    while(i < 5) {
        ...
    }

  4. while yerine for döngüsü daha anlaşılır olacaktır çünkü i ne olursa olsun artıyor:
    C:
    for(int i = 0; i < 5; i++) {
        // ...
    }
    Bazı -eski- derleyiciler int i;'nin döngünün içinde yazılmasını desteklemiyordu, tam hakim değilim o konuya. Sizinki destekliyordur muhtemelen.

  5. printf'lerde yeni satıra geçmeleri unutmuşsunuz, şöyle yaparsanız çıktı istediğiniz gibi gözükecektir:
    1. printf("%s%15s\n", "Element", "Value");
    2. printf("%3d%17d\n", i + 1, dizi[i]);
  6. Dizinin boyutunu bir sabite atayıp kod boyunca bu sabiti kullanmak daha uygun olacaktır. Bunun getireceği kolaylık, dizinin eleman sayısını değiştirmek istediğimizde tek yerde değişiklik yapmamızın yetmesi olur. @TheAny'nin sunduğu koddaki gibi #define kullanabilirsiniz veya const int N = 5; falan da diyebilirsiniz.
hata yazdığınız 3. maddeyi uygulayınca düzeldi teşekkür ederim
 

Technopat Haberler

Yeni konular

Geri
Yukarı