Şimdi Ara

c de artırma azaltma operatörü hakkında

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
24
Cevap
1
Favori
3.591
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • #include <stdio.h> 

    int main(){
    int a=11,x;

    x= ++a * a--;

    printf("a= %d\n",a);
    printf("x= %d\n",x);

    return 0;
    }



    Yukarıdaki kodda x in nasıl 132 olduğunu açıklar mısınız ?



    < Bu mesaj bu kişi tarafından değiştirildi hellbas -- 30 Kasım 2014; 14:47:22 >



  • a= 11
    x= 132
    Programın çıktısı bu şekilde.
    ++a ile a++ arasındaki farkı biliyorsun değil mi?
  • KillForYou! kullanıcısına yanıt
    biliyorum ancak araya işlem girdimi kafam karışıyor. işlemi anlatırmısın bana
  • quote:

    Orijinalden alıntı: hellbas

    biliyorum ancak araya işlem girdimi kafam karışıyor. işlemi anlatırmısın bana
    #include <stdio.h>

    int main(){
    int a=11,x; //a ve x gibi iki tane int tipinde sayı tanımlıyoruz. a'ya 11 değerini atıyoruz, x'e eğer atamıyoruz.

    x= ++a * a--; //x değerini iki sayı ile çarpıyoruz. Birinci sayı ++a ile önce a değerini bir arttırıyoruz (12), sonra işleme alıyoruz. a-- ile önce a sayısını işleme sokuyor (11), sonra değerini bir azaltıyoruz.

    printf("a= %d\n",a);//a sayısının son değerini ekrana yazdırıyoruz.
    printf("x= %d\n",x);//x sayısının değerini ekrana yazdırıyoruz.

    return 0;
    }
  • KillForYou! kullanıcısına yanıt
    tmm ancak bide şu aşağıdaki programa bak sonuc nasıl 142 oluyor ??


    #include <stdio.h> 

    int main(){
    int a=10,x;

    x= a++ + ++a * a--;

    printf("a= %d\n",a);
    printf("x= %d\n",x);

    return 0;
    }
  • * işlemi olunca, düşündüğümüz gibi yapıyor.
    Her bir a'yı önce 11 olarak alıyor. Arttırım ve azaltmaları x atamasından sonra yapıyor.
    + işlemi olunca satır içinde a değeri değişikliğini yansıtıyor. x değer atamasını beklemiyor.
  • KillForYou! kullanıcısına yanıt
    hiç anlamadım a=10 vermiş nie 11 alıryor
  • hellbas H kullanıcısına yanıt
    yanlışınız var program çıktısı:
    a = 11;
    x = 144; şeklinde olur.

    Misal Değişkenin başına artırma operatörü koyduğumuzda hem artar hemde o artmış değeri bize verir, değişenin sonuna arttırma operatörü koyduğumuzda değişkenin değeri artar ama o satırda bize o artmış değeri döndürmez diyebiliriz bir örnekle açıklayalım:

    int z = 10;

    // burda z 1 artırılır ve artırılmış değer döndürülür
    // yani 11 değerini ekranda görebilriz
    printf("%d", ++z);

    // burda z ilk verilir sonra artırırlır diyebilriz
    // yani z'nin buradaki artırırlmadan önceki değerini göreceğiz yani çıktı yine 11 olacak ama z'yi alt satırlarda kullanmak istersek 12 olduğunu görebilceğiz
    printf("%d", z++);

    // z burda 12 yukarda arttırmıştk
    printf("%d", z);

    şimdi senin soruna gelecek olursak:

    x = ++a * a--;

    arttırma operatörü değişenin önüne konmuş bu durumda a 1 artacak ve değer oraya dönecek hali:

    x = 12 * a--;

    şimdide a'nun sonuna azaltma operatörü konmuş a 1 eksilecek ama oraya eksimiş hali dönmeyecek a'nın o anki hali dönecek yani:

    x = 12 * 12;
    x = 144;




  • lavara123 kullanıcısına yanıt
    ancak program derlenınce 132 veriyor.

     c de artırma azaltma operatörü hakkında
     c de artırma azaltma operatörü hakkında




  • hellbas H kullanıcısına yanıt
    derleyiciden derleyice değişebiliyor. Ama şuanda gezen dedikodulara göre 144 vermesi lazım Visual Studio 2012'de 144 değeri döner mesela...

    Bi şurayı oku istersen..:http://kaanaslan.com/blog/blog/display_blog.php?id=59
  • lavara123 kullanıcısına yanıt
    Haklısin visual 2013 ile derledim sonuc :

     c de artırma azaltma operatörü hakkında


    Acaba mingw de mi bir skıntı var anlamadım ya :)
     c de artırma azaltma operatörü hakkında




  • quote:

    Orijinalden alıntı: hellbas

    Haklısin visual 2013 ile derledim sonuc :

     c de artırma azaltma operatörü hakkında


    Acaba mingw de mi bir skıntı var anlamadım ya :)
     c de artırma azaltma operatörü hakkında

    o yazıdada dediği gibi belli olmuyor tamamen derleyiciye kalmış birşey herhalde .d

    Dev-C++ 4.9.9.2(mingw32 v3.4.2)'de de 144 değerini veriyor




  • lavara123 kullanıcısına yanıt
    Cevap için saol bu konuyu ilerde daha iyi araştıracağım ..
  • lavara123 kullanıcısına yanıt
    ideone sitesindeki derleyicide 142 oluyor.
    http://ideone.com/aHDtHW
  • KillForYou! kullanıcısına yanıt
    // 144
    http://codepad.org/5y7AEFJt

    // 132
    http://ideone.com/JPY2Wx

    işte o yazıda anlatılan gibi herhalde .d

    (arkadaşın ilk verdiği koddan bahsediliyordu)



    < Bu mesaj bu kişi tarafından değiştirildi lavara123 -- 30 Kasım 2014; 16:00:12 >
  • lavara123 kullanıcısına yanıt
    Evet, var bir anormallik.
  • Java, C# ve C++'ta . . :

    // java..:144
    http://ideone.com/G0hDau

    // C#..: 144
    http://ideone.com/BRGuJS

    // C++..: 132
    http://ideone.com/UHUTAx




  • Kodu derleyip diassembly ettim. gcc hiçbir şekilde hesaplama yapmıyor. a' ya 11 verip ekrana basıyor, sonra da x' e 132 verip ekrana basıyor (derleme anında hesaplıyor).

    a' yı global kapsama alırsanız derleyici başka bir context ten a' ya erişilebileceğini düşünerek normal hesaplama yapıyor. Böylece x 144 oluyor. a' nın değerini dışardan verdiğinizde de olması gerektiği gibi hesaplandığını göreceksiniz.

    Dil standartları bu tür ince ayrıntıları belirlemediği için derleyici davranışları da farklılaşabiliyor.
  • quote:

    Orijinalden alıntı: seyfi84

    Bu mesaj silindi.

    Alıntıları Göster
    Eğer zaten uyarılar açık şekilde derlerseniz derleyicinin:
     
    warning: operation on ‘a’ may be undefined [-Wsequence-point]
    x = ++a * a--;

    Şeklinde uyarı vereceğini görebilirsiniz.

    C++0x ile bu davranışların standarda girdiğini okudum ancak, bendeki g++, c++0x ile derlememe rağmen aynı satırda yine de uyarı verdi.

    En iyisi bu tarz belirsiz ifadelerden uzak durmak.



    < Bu mesaj bu kişi tarafından değiştirildi Fatih513 -- 30 Kasım 2014; 17:59:14 >
  • ben kendi derleyicimde(Vs 2012) şöyle bir izlenime vardım..:
     c de artırma azaltma operatörü hakkında
  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.