Son artırma (i ++) ve ön artırma (++ i) operatörleri Java'da nasıl çalışır?


100

Bu Java kodunun çıktısını bana açıklar mısınız?

int a=5,i;

i=++a + ++a + a++;
i=a++ + ++a + ++a;
a=++a + ++a + a++;

System.out.println(a);
System.out.println(i);

Her iki durumda da çıktı 20'dir


9
Her zaman belirsiz ifadelerden kaçının :)
Prasoon Saurav

9
@Prasoon Saurav C ve C ++ 'dan farklı olarak, Java ve C # kesin olarak tanımlanmış değerlendirme sırasına sahiptir, bu nedenle bu ifadeler belirsiz değildir.
Pete Kirkham

12
Biliyorum ama yine de bu ifadeler pratik amaç için kullanılmıyor (kullanılamıyor), bu yüzden bundan kaçınmak gerekiyor.
Prasoon Saurav


4
@PeteKirkham Altı yıldan fazla oldu, ancak yine de "belirsiz" ifadesinin belirsiz olduğunu belirtmek istiyorum - bu "derleyicinin ne yazacağını bilmediği" anlamına gelebilir veya "Programcı ne anlama geldiği hakkında hiçbir fikri yok ".
Fund Monica'nın Davası

Yanıtlar:


152

Bu yardımcı olur mu?

a = 5;
i=++a + ++a + a++; =>
i=6 + 7 + 7; (a=8)

a = 5;
i=a++ + ++a + ++a; =>
i=5 + 7 + 8; (a=8)

Ana nokta, ++adeğeri artırması ve hemen döndürmesidir.

a++ ayrıca değeri artırır (arka planda) ancak değişkenin değişmemiş değerini döndürür - daha sonra çalıştırılacak gibi görünür.


5
İkincisinde a == 9 olduğundan emin misiniz?
Pete Kirkham

1
i = ++ a + ++ a + a ++; => i = 7 + 8 + 5; (a = 8) Arttırma sonrası en yüksek önceliğe sahip olduğundan, önce a ++ mı çalıştırılır?
rsirs

2
açıklaması kolay bir şeye karmaşık bir örnek.
oznus

Bu cevap c # ve c ++ için aynı mıdır?
workoverflow

Burada a, b ve c neden 2'ye eşittir? int a = 1; int b = a++; int c = ++b;Bir artım olduğu için b'nin 1 olmasını bekliyordum.
Dennis

204

++aartar ve sonra değişkeni kullanır.
a++değişkeni kullanır ve ardından artırır.

Eğer varsa

a = 1;

ve sende yap

System.out.println(a++); //You will see 1

//Now a is 2

System.out.println(++a); //You will see 3

codaddict sizin özel pasajınızı açıklar .


64

Her iki durumda da önce değeri hesaplar, ancak artım sonrası eski değeri tutar ve hesapladıktan sonra onu döndürür.

++ a

  1. a = a + 1;
  2. dönüş a;

a ++

  1. temp = a;
  2. a = a + 1;
  3. dönüş sıcaklığı;

8
En
net

2
bu açıkça anlamamı sağlayan şeydi .. teşekkürler.
rematnarab

22
i = ++a + ++a + a++;

dır-dir

i = 6 + 7 + 7

Çalışma : a'dan 6'ya artış (mevcut değer 6) + a'dan 7'ye artırma (mevcut değer 7). Şimdi toplam 13'tür şimdi onu mevcut a (= 7) değerine ekleyin ve ardından a'yı 8'e yükseltin. Toplam 20'dir ve atama tamamlandıktan sonra a'nın değeri 8'dir.

i = a++ + ++a + ++a;

dır-dir

i = 5 + 7 + 8

Çalışma : a'nın başlangıç ​​değerinde 5'tir. Eklemede kullanın ve sonra 6'ya yükseltin (mevcut değer 6). Diğer + işlenenini elde etmek için a'yı 6'dan 7'ye yükseltin. Toplam 12 ve a'nın mevcut değeri 7'dir. Sonraki a'yı 7'den 8'e yükseltin (mevcut değer = 8) ve 20 elde etmek için önceki toplam 12'ye ekleyin.


bu ifadeler sağdan sola mı yoksa soldan sağa mı çalışıyor?
Abhijeet

10

++aadeğerlendirilmeden önce artar . a++değerlendirir ave sonra artırır.

Verdiğiniz ifadeyle ilgili:

i = ((++a) + (++a) + (a++)) == ((6) + (7) + (7)); // a is 8 at the end
i = ((a++) + (++a) + (++a)) == ((5) + (7) + (8)); // a is 8 at the end

Yukarıda kullandığım parantezler Java tarafından örtülü olarak kullanılıyor. Terimlere bu şekilde bakarsanız, her ikisinin de değişmeli oldukları gibi aynı olduklarını kolayca görebilirsiniz.


1
@ KlasLindbäck değişmeli, her iki ifadeyi de değiştirebileceğiniz ve yine de aynı sonucu alabileceğiniz anlamına gelir. Yani a ++ + ++ a == ++ a + a ++ (5 + 7 == 6 + 6; a == 7 sonunda).
Aurril

8

Yukarıdaki örnekte

int a = 5,i;

i=++a + ++a + a++;        //Ans: i = 6 + 7 + 7 = 20 then a = 8 

i=a++ + ++a + ++a;        //Ans: i = 8 + 10 + 11 = 29 then a = 11

a=++a + ++a + a++;        //Ans: a = 12 + 13 + 13 = 38

System.out.println(a);    //Ans: a = 38

System.out.println(i);    //Ans: i = 29

4

++ a, önek artırma operatörüdür:

  • sonuç önce hesaplanır ve saklanır,
  • daha sonra değişken kullanılır.

a ++ sonek artış operatörüdür:

  • değişken önce kullanılır,
  • daha sonra sonuç hesaplanır ve saklanır.

Kuralları bir kez hatırladığınızda, her şeyi hesaplamanız için EZ!


4

Kastettiğini varsayarsak

int a=5; int i;

i=++a + ++a + a++;

System.out.println(i);

a=5;

i=a++ + ++a + ++a;

System.out.println(i);

a=5;

a=++a + ++a + a++;

System.out.println(a);

Bu şu şekilde değerlendirilir:

i = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

yani i 6 + 7 + 7 = 20'dir ve bu nedenle 20 yazdırılır.

i = (5, a is now 6) + (7, a is now 7) + (8, a is now 8)

yani i 5 + 7 + 8 = 20'dir ve böylece 20 tekrar yazdırılır.

a = (6, a is now 6) + (7, a is now 7) + (7, a is now 8)

ve sağ tarafın tümü değerlendirildikten sonra (a'yı 8'e ayarlamak dahil) SONRA a, 6 + 7 + 7 = 20'ye ayarlanır ve böylece 20, son kez yazdırılır.


3

zaman a5, daha sonra a++ifade ve artışlarla bir 5 veren a, daha sonra ise ++aartışlarla a(veren ekspresyonu için sayı geçirmeden önce a, bu durumda ifade 6).

Yani hesapla

i = 6 + 7 + 7
i = 5 + 7 + 8

3

Ancak, tüm ifadelerinizi birleştirir ve Java 8.1'de çalıştırırsanız farklı bir yanıt alacağınıza inanıyorum, en azından benim deneyimim böyle diyor.

Kod şu şekilde çalışacaktır:

int a=5,i;

i=++a + ++a + a++;            /*a = 5;
                                i=++a + ++a + a++; =>
                                i=6 + 7 + 7; (a=8); i=20;*/

i=a++ + ++a + ++a;           /*a = 5;
                                i=a++ + ++a + ++a; =>
                                i=8 + 10 + 11; (a=11); i=29;*/

a=++a + ++a + a++;            /*a=5;
                                a=++a + ++a + a++; =>
                                a=12 + 13 + 13;  a=38;*/

System.out.println(a);        //output: 38
System.out.println(i);         //output: 29

3

Ön artış, değişkenin ifadede değerlendirilmeden ÖNCE artırıldığı anlamına gelir. Artış sonrası, değişkenin ifadede kullanılmak üzere değerlendirildikten SONRA artırıldığı anlamına gelir.

Bu nedenle dikkatlice bakın ve üç ödevin de aritmetik olarak eşdeğer olduğunu göreceksiniz.


2

ön artış ve artım sonrası bir ifadede değilse eşdeğerdir

int j =0;
int r=0         
for(int v = 0; v<10; ++v) { 
          ++r;
          j++;
          System.out.println(j+" "+r);
  }  
 1 1  
 2 2  
 3 3       
 4 4
 5 5
 6 6
 7 7
 8 8
 9 9
10 10

0
a=5; i=++a + ++a + a++;

dır-dir

i = 7 + 6 + 7

Çalışma: ön / son artış, "sağdan sola" İlişkilendirme özelliğine sahiptir ve ön, gönderiye göre önceliğe sahiptir, bu nedenle her şeyden önce ön artış olarak çözülecektir (++a + ++a) => 7 + 6. daha sonra a=7artım göndermek için sağlanır => 7 + 6 + 7 =20ve a =8.

a=5; i=a++ + ++a + ++a;

dır-dir

i=7 + 7 + 6

Çalışma: pre / post artım olarak çözmek olacak böylece her şeyden önce ön artım Associativity ve öncesi "sol hakkı" yazı üzerinde önceliğe sahiptir, sahip (++a + ++a) => 7 + 6.o a=7sonrası artış sağlanmıştır => edilir 7 + 7 + 6 =20ve a =8.


0

Tüm bu ifadeleri farklı şekilde yürüttüğünüze inanıyorum
, sonuç olarak => 38, 29

int a=5,i;
i=++a + ++a + a++;
//this means i= 6+7+7=20 and when this result is stored in i,
//then last *a* will be incremented <br>
i=a++ + ++a + ++a;
//this means i= 5+7+8=20 (this could be complicated, 
//but its working like this),<br>
a=++a + ++a + a++;
//as a is 6+7+7=20 (this is incremented like this)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.