Neden x + = y gibi kısayollar iyi uygulama olarak kabul edilir?


305

Bunların gerçekte ne dendiği hakkında hiçbir fikrim yok, ama onları her zaman görüyorum. Python uygulaması şöyle bir şey:

x += 5için bir kestirme notasyon olarak x = x + 5.

Peki bu neden iyi bir uygulama olarak kabul edilir? Python, C, R vb. İçin okuduğum hemen hemen her kitapta veya programlama dersinde rastladım . Boşluklar da dahil olmak üzere üç tuşa basarak tasarruf etmenin uygun olduğunu anladım. Ama kod okurken her zaman beni gezdirecek gibi görünüyorlar ve en azından aklımda daha az okunabilir hale geliyorlar .

Bunların her yerde kullanılmasının açık ve açık bir nedenini özlüyor muyum?


@EricLippert: C #, bunu en iyi cevaplananla aynı şekilde ele alıyor mu? Aslında daha verimli CLR-bilge söylemek mi x += 5daha x = x + 5? Yoksa gerçekten önerdiğin gibi sadece sözdizimsel bir şeker mi?
saat

24
@blesh: Kaynak koduna bir ilavenin nasıl ifade edildiğinin küçük detaylarının , sonuçta ortaya çıkan yürütülebilir kodun etkinliği üzerinde bir etkisi olduğu 1970’te olabilir; kesinlikle şimdi değil. Derleyicileri optimize etmek iyidir ve burada veya oradaki bir nanosaniyeden daha büyük endişeleriniz var. + = Operatörünün "yirmi yıl önce" geliştirildiği fikri açıkça yanlıştır; Son Dennis Richie, 1969'dan 1973'e kadar C'yi Bell Labs'de geliştirdi.
Eric Lippert

1
Bkz blogs.msdn.com/b/ericlippert/archive/2011/03/29/... (ayrıca parçasını iki bakınız)
SLaks

5
Çoğu işlevsel programcı bu kötü uygulamayı dikkate alacaktır.
Pete Kirkham

Yanıtlar:


598

Bu steno değil.

+=: Açıkça farklı makine talimat ve adresleme moduna uygun "akıllı assembler" C fikri ile - sembol 1970'lerde C dilinde göründü ve

" i=i+1", "i+=1"Ve" ++i" gibi şeyler , soyut düzeyde aynı etkiyi yaratsa da, düşük seviyede işlemcinin farklı çalışma şekillerine karşılık gelir.

Özellikle bu üç ifadeler, varsayarak ideğişken bir işlemci kayıt içine depolanmış olan bellek adresi bulunur (en bunun adı izin Dve - "int pointer" olarak düşünmek) ALU işlemcinin bir parametre alır ve bir de bir sonuca dönmek "akümülatör" (hadi A diyelim - bunu bir int olarak düşünün).

Bu kısıtlamalarla (bu dönemin tüm mikroişlemcilerinde çok yaygın), çeviri büyük olasılıkla olacaktır.

;i = i+1;
MOV A,(D); //Move in A the content of the memory whose address is in D
ADD A, 1;  //The addition of an inlined constant
MOV (D) A; //Move the result back to i (this is the '=' of the expression)

;i+=1;
ADD (D),1; //Add an inlined constant to a memory address stored value

;++i;
INC (D); //Just "tick" a memory located counter

Bunu yapmanın ilk yolu disoptimaldir, ancak sabit ( ADD A, Bveya ADD A, (D+x)) yerine değişkenlerle çalışırken veya daha karmaşık ifadeler çevrildiğinde (hepsi bir yığında düşük öncelikli işlem sırasında aşağı kayıyorlarsa, yüksek öncelikli çağrı yapın, ve tüm argümanlar ortadan kalkana kadar tekrarlayın).

İkincisi “durum makinesi” için daha tipiktir: artık bir ifadeyi “değerlendirmiyoruz”, ancak “bir değeri işletiyoruz”: yine de ALU kullanıyoruz, ancak sonucun parametrenin yerine geçmesine izin verilmesini engelliyoruz. Bu tür talimatlar, daha karmaşık ifadelerin gerekli olduğu yerlerde kullanılamaz: i = 3*i + i-2yerinde çalıştırılamaz, çünkü idaha çok kez gereklidir.

Üçüncü-on basit, "toplama" fikrini bile düşünmez, fakat bir sayaç için daha "ilkel" (hesaplamalı anlamda) bir devre kullanır. Yönerge kısaltılır, daha hızlı yüklenir ve derhal yürütülür, çünkü bir tezgahın daha küçük olması için bir kaydın güçlendirilmesi için gerekli olan kombinatoryal ağ tam bir toplayıcıdan daha hızlıdır ve bu nedenle tam bir toplayıcıdan daha hızlıdır.

Çağdaş derleyicilerde (şimdiye kadar C'ye bakın), derleyici optimizasyonunu mümkün kılan yazışmalar, uygunluğa dayalı olarak değiştirilebilir, ancak anlambilimde hala kavramsal bir fark vardır.

x += 5 anlamına geliyor

  • X ile tanımlanan yeri bulun
  • Buna 5 ekle

Ancak şu x = x + 5anlama gelir:

  • Değerlendirin x + 5
    • X ile tanımlanan yeri bulun
    • X'i bir akümülatöre kopyala
    • Aküye 5 ekleyin
  • Sonucu x olarak sakla
    • X ile tanımlanan yeri bulun
    • Akümülatörü buna kopyalayın

Tabii ki, optimizasyon olabilir

  • "x bulma" nın hiçbir yan etkisi yoksa, iki "bulma" bir kez yapılabilir (ve x bir işaretçi kaydında saklanan bir adres olur)
  • &xakü yerine ADD uygulanırsa iki kopya seçilebilir

Böylece optimize edilmiş kod bir birine çakışıyor x += 5.

Ancak bu sadece "x bulma" nın yan etkisi yoksa yapılabilir.

*(x()) = *(x()) + 5;

ve

*(x()) += 5;

anlamsal olarak farklıdır, çünkü x()yan etkiler (kabul etmek x()garip şeyler yapan ve geri dönen bir işlevdir int*) iki veya bir kez üretilecektir.

Arasında eşdeğerlik x = x + yve x += ynedeniyle özel durumda dolayısıyla olan +=ve =doğrudan L-değeri uygulanır.

Python'a geçmek için, C'nin sözdizimini miras aldı; ancak, yorumlanmış dillerde yürütmeden ÖNCE çeviri / optimizasyon olmadığından, işler mutlaka yakından ilişkili değildir (çünkü daha az bir ayrıştırma adımı vardır). Bununla birlikte, bir tercüman, ifadenin nasıl oluştuğuna ve değerlendirme bağlamına bağlı olarak farklı makine kodundan yararlanarak, üç ifade tipi için farklı yürütme rutinlerine başvurabilir.


Daha fazla ayrıntıyı sevenler için ...

Her CPU, özünde, girişleri ve çıktısı talimatların koduna bağlı olarak kayıt defterlerine ve / veya hafızaya "takılı" olan bir birleştirme ağına sahip olan bir ALU'ya (aritmetik-mantıksal birime) sahiptir.

İkili işlemler tipik olarak "bir yerde" girişi alınmış bir girişe sahip bir akümülatör kaydının değiştiricisi olarak gerçekleştirilir, burada bir yerde - komut akışının içinde (açık değişken için tipik: ADD A 5) - başka bir kayıt içinde (ifade hesaplaması için tipik geçici değerler: örn. ADD AB) - hafızanın içinde, bir yazmaç tarafından verilen adreste (tipik olarak veri toplama örneği: örn. ADD A (H)) - H, bu durumda bir referans gösterici gibi çalışır.

Bu sözde kod x += 5ile

ADD (X) 5

süre x = x+5olduğu

MOVE A (X)
ADD A 5
MOVE (X) A

Yani, x + 5, daha sonra atanacak bir geçici verir. x += 5doğrudan x üzerinde çalışır.

Gerçek uygulama işlemcinin gerçek talimat setine bağlıdır: Eğer bir ADD (.) copcode yoksa, ilk kod ikinci olur: olmaz.

Böyle bir opcode varsa ve optimizasyon etkinleştirilirse, ikinci ifade, geriye doğru hareketleri ortadan kaldırdıktan ve kayıt opcode'unu ayarladıktan sonra, ilk ifadedir.


90
Eskiden farklı (ve daha verimli) bir makine koduyla eşleştirmek için kullanıldığını açıklayan tek cevap için +1.
Péter Török,

11
@KeithThompson Bu doğru, ancak meclisin C diline (ve ardından tüm C tarzı dillere) tasarımı üzerinde büyük bir etkisi olduğu inkar edilemez
MattDavey

51
Erm, "+ =", "inc" ile eşleşmiyor ("add" ile eşleşiyor), "++" "inc" ile eşleşiyor.
Brendan,

11
"20 yıl önce" derken, "30 yıl önce" demek istediğini düşünüyorum. Ve BTW, COBOL C ile 20 yıl daha mağlup etti: 5 ADD TO X.
JoelFan

10
Teoride harika; gerçeklerde yanlış. X86 ASM INC sadece 1 ekler, bu yüzden burada tartışılan "ekle ve ata" işlecini etkilemez (bu, "++" ve "-" için harika bir cevap olacaktır).
Mark Brackett

281

Nasıl düşündüğünüze bağlı olarak, anlaşılması daha kolay çünkü daha kolay. Mesela:

x = x + 5 "x'i al, ona beş ekle ve sonra bu yeni değeri x'e geri koy" un zihinsel işlemesini çağırır.

x += 5 "5 x x artırmak" olarak düşünülebilir

Yani, sadece kısa yol değil, aslında işlevselliği daha doğrudan tarif ediyor. Gobra kodlarını okurken, kavraması çok daha kolaydır.


32
+1, tamamen katılıyorum. Çocukken programlamaya başladım, aklım kolayca dövülebilirken ve x = x + 5hala beni rahatsız ediyordu. Daha sonraki yaşlarda matematiğe girdiğimde, beni daha da rahatsız etti. Kullanmak x += 5, önemli ölçüde daha açıklayıcıdır ve ifade olarak çok daha anlamlı olur.
Polinom

44
Değişkenin uzun bir isme sahip olduğu durumlar da vardır: reallyreallyreallylongvariablename = reallyreallyreallylongvariablename + 1... oh noes !!! bir yazım hatası

9
@ Matt Fenwick: Uzun bir değişken ismi olmak zorunda değildir; bir çeşit ifade olabilir. Bunların doğrulanması daha da zor olabilir ve aynı olduklarından emin olmak için okuyucunun çok dikkat etmesi gerekir.
David Thornley

32
X = X + 5, hedefiniz x'in 5'i
artırması

1
@ Polinomial Sanırım çocukken x = x + 5 kavramına da rastladım. 9 yaşında, doğru hatırlıyorsam - ve bana mükemmel geldi ve şimdi hala bana çok mantıklı geliyor ve daha çok x + = 5'i tercih ediyor. x'i, önceki x değeri (her ne ise) olarak atadığım ve daha sonra 5 eklediğim fikri, sanırım farklı beyinler farklı şekillerde çalışıyor.
Chris Harrison

48

En azından Python , x += yve x = x + ytamamen farklı şeyler yapabilirsiniz.

Örneğin, yaparsak

a = []
b = a

daha sonra a += [3]sonuçlanır a == b == [3], süre ve a = a + [3]sonuçlanır . Yani, nesneyi yerinde değiştirir (yani, yapabilir, istediğiniz herhangi bir şeyi yapma yöntemini tanımlayabilirsiniz ), yeni bir nesne oluşturur ve değişkeni ona bağlar.a == [3]b == []+=__iadd__=

NumPy ile sayısal çalışma yaparken , bir dizinin farklı bölümlerine sıklıkla yapılan birden fazla referansla sona erdiğiniz için bu çok önemlidir ve bir dizinin diğer referanslarını içeren bir bölümünü istemeden değiştirmemenizi sağlamak önemlidir. veya gereksiz yere dizileri kopyalayın (bu çok pahalı olabilir).


4
1 için __iadd__: Bir değişken veri tipleri de, bir değişmez referans oluşturabilirsiniz dil vardır operator +=: tanımlanır, örneğin scala val sb = StringBuffer(); lb += "mutable structure"vs var s = ""; s += "mutable variable". bu, veri yapısının içeriğini daha da değiştirirken, ikincisi değişken noktayı yenisine işaret eder.
uçan koyun

43

Deyim denir . Programlama deyimleri, belirli bir programlama yapısını tutarlı bir şekilde yazmaları nedeniyle yararlıdır.

Birisi yazıyor zaman x += ybunu biliyor xtarafından artırılır ediliyor y(en iyi uygulama olarak, genellikle daha karmaşık işlemler ve bu sözdizimi kestirme karıştırmak olmaz) biraz daha karmaşık operasyonu değil. Bu 1 ile artış yaparken en anlamlı olanıdır.


13
x ++ ve ++ x, x + = 1 ve birbirlerinden biraz farklıdır.
Gary Willoughby

1
@Gary: ++xve x+=1C ve Java'da (belki ayrıca C #) da eşdeğerdir, ancak buradaki C ++ 'da karmaşık işleçsel anlambilim nedeniyle. Önemli olan, her ikisinin de bir xkez değerlendirme yaptığı, değişkeni birer birer artırdığı ve değerlendirmeden sonra değişkenin içeriği olan bir sonuç almasıdır.
Donal Fellows

3
@ Donal Fellows: Öncelik farklı, bu yüzden ++x + 3aynı değil x += 1 + 3. Parantezlenir x += 1ve aynıdır. Kendileri tarafından ifadeler olarak, onlar aynıdır.
David Thornley

1
@DavidThornley: İkisinin de tanımsız davranışı olduğunda "özdeş olduklarını" söylemek zor :) :)
Orbit'teki Hafiflik Yarışları

1
İfadelerin hiçbiri ++x + 3, x += 1 + 3ya (x += 1) + 3(çıkan değer "uyuyor" varsayarak) davranışını tanımsız var.
John Hascall

42

@ Pubby'nin amacını biraz daha netleştirmek için someObj.foo.bar.func(x, y, z).baz += 5

+=Operatör olmadan gitmek için iki yol vardır:

  1. someObj.foo.bar.func(x, y, z).baz = someObj.foo.bar.func(x, y, z).baz + 5. Bu sadece çok fazla gereksiz ve uzun değil, aynı zamanda daha yavaş. Bu nedenle bir
  2. Geçici değişken kullanın: tmp := someObj.foo.bar.func(x, y, z); tmp.baz = tmp.bar + 5. Bu tamam, ama basit bir şey için çok fazla gürültü. Bu aslında çalışma zamanında olanlara gerçekten çok yakın, ancak yazmak çok zahmetli ve sadece +=işiniz derleyici / tercümana geçecek.

Bu +=tür operatörlerin ve diğer operatörlerin avantajı inkar edilemez, onlara alışmak sadece zaman meselesidir.


Nesne zincirinin derinliklerinde 3 seviye olduğunuzda, 1 gibi küçük optimizasyonları ve 2 gibi gürültülü kodları önemsemeyi bırakabilirsiniz. Bunun yerine, tasarımınızı bir kez daha düşünün.
Dorus

4
@Dorus: Seçtiğim ifade "karmaşık ifade" için yalnızca isteğe bağlı bir temsilcidir. Kafandaki bir şeyle değiştirmekte özgürsün, azdırmayacaksın;)
back2dos

9
+1: Bu, bu optimizasyonun temel nedeni - sol taraftaki ifadenin ne kadar karmaşık olursa olsun her zaman doğru.
S.Lott

9
Oraya bir yazım hatası koymak, neler olabileceğine dair güzel bir örnek.
David Thornley

21

Daha kısa ve daha kolay olduğu doğrudur ve bunun altında yatan derleme dilden ilham almış olması doğrudur, ancak en iyi uygulamasının nedeni , bütün bir hata sınıfını engellemesi ve kodu incelemeyi kolaylaştırması ve bundan emin olması gerektiğidir. bu ne yapar.

İle

RidiculouslyComplexName += 1;

Tek bir değişken adı bulunduğundan, ifadenin ne yaptığından emin olabilirsiniz.

İle RidiculouslyComplexName = RidiculosulyComplexName + 1;

İki tarafın tamamen aynı olduğundan her zaman şüphe vardır. Hatayı gördün mü? Abonelikler ve elemeler mevcut olduğunda daha da kötüleşir.


5
Atama ifadelerinin örtük olarak değişkenler yaratabildiği dillerde, özellikle de diller büyük / küçük harf duyarlıysa, bu durum daha da kötüye gider.
supercat

14

+ = Notasyonu deyimsel ve daha kısa olsa da, bunlar okunmasının daha kolay olmasının sebepleri değildir. Okuma kodunun en önemli kısmı, sözdiziminin anlamla eşleştirilmesidir ve bu nedenle sözdizimi programcının düşünce süreçleriyle ne kadar yakınsa o kadar okunabilir (o da aynı zamanda bülbül kodunun kötü olmasının nedenidir: düşüncenin bir parçası değildir) işlem, ancak yine de kod işlevini yapmak için gerekli). Bu durumda, düşünce "x'in 5'i arttırdığı değişkendir", "x'in x artı 5'in değeri olmasına izin vermeyin" dir.

Daha kısa bir gösterimin okunabilirlik için kötü olduğu başka durumlar da vardır, örneğin bir ififadenin daha uygun olacağı bir üçlü operatör kullanırken .


11

Bu operatörlerin neden 'C tarzı' dillerde olduklarına dair bir içgörü için , 34 yıl önce K&R 1st Edition (1978) ' den bir alıntı var :

Kısa olmanın yanı sıra, atama operatörleri insanların düşündükleriyle daha iyi uyuşma avantajına sahiptir. "İ'ye 2 ekle" ya da "i'yi 2'ye kadar artır," değil "al, 2 ekle, sonra sonucu i" ye koyuyoruz. Böylece i += 2. Ayrıca, gibi karmaşık bir ifade için

yyval[yypv[p3+p4] + yypv[p1+p2]] += 2

atama operatörü kodu anlamayı kolaylaştırır, çünkü okuyucunun iki uzun ifadenin gerçekten aynı olduğunu ya da neden olmadığını merakla kontrol etmesi gerekmez. Ve bir atama operatörü, derleyicinin daha verimli kod üretmesine bile yardımcı olabilir.

Sanırım bu bölümden Brian Kernighan ve Dennis Ritchie'nin (K&R), bileşik tahsis operatörlerinin kod okunabilirliğine yardımcı olduğuna inandıkları açık.

K & R'nin bunu yazmasından bu yana uzun zaman geçti ve insanların nasıl kod yazması gerektiğine ilişkin 'en iyi uygulamaların' çoğu o zamandan beri değişti veya gelişti. Ama bu programmers.stackexchange sorusu ilk defa, bileşik ödevlerin okunabilirliği hakkında bir şikayeti dile getiren birini hatırlayabildiğim için, pek çok programcının onları bir sorun olarak bulup bulmadığını merak ediyorum. Sonra tekrar, bunu yazarken sorunun 95 oyu vardır, bu yüzden belki de insanlar kod okurken onları sıkıntılı bulurlar.


9

Okunabilirliğin yanı sıra, aslında farklı şeyler yaparlar: +=sol operandını iki kere değerlendirmek zorunda değildir.

Mesela, iki kere expr = expr + 5dağılır expr(varsayımsız expr).


En garip derleyiciler hariç herkes için farketmez. Çoğu derleyici, aynı ikiliyi oluşturacak kadar akıllıdır expr = expr + 5veexpr += 5
vsz

7
@vsz exprYan etkileri varsa olmaz .
Pubby

6
@vsz: C'de, expryan etkileri varsa , bu yan etkileri iki kez çağırması expr = expr + 5 gerekir .
Keith Thompson,

@Pubby: Eğer yan etkileri varsa, orjinal sorunun konusu olan "uygunluk" ve "okunabilirlik" ile ilgili bir sorun yoktur.
vsz

2
Bu "yan etkiler" ifadeleri konusunda dikkatli olsanız iyi olur. Okur ve yazar volatileyan etkileri vardır ve x=x+5ve x+=5aynı yan etkileri var xisevolatile
MSalters

6

Başkalarının çok iyi tanımladığı bariz özelliklerin yanı sıra, çok uzun isimleriniz olduğunda daha kompakt.

  MyVeryVeryVeryVeryVeryLongName += 1;

veya

  MyVeryVeryVeryVeryVeryLongName =  MyVeryVeryVeryVeryVeryLongName + 1;

6

Özlü.

Yazması çok daha kısa. Daha az sayıda operatör içerir. Daha az yüzey alanına ve daha az karışıklığa neden olur.

Daha spesifik bir operatör kullanıyor.

Bu tartışmalı bir örnektir ve gerçek derleyiciler bunu uygulayıp uygulamadığından emin değilim. x + = y aslında bir argüman ve bir işleç kullanır ve x'i yerinde değiştirir. x = x + y, z = x + y olan x = z'nin ara temsiline sahip olabilir. İkincisi iki operatör, toplama ve atama ve geçici bir değişken kullanır. Tek operatör, değer tarafının y dışında bir şey olamayacağını ve yorumlanması gerekmediğini açıkça ortaya koymaktadır. Ve teorik olarak artı bir operatörden ve seri olarak bir atama operatöründen daha hızlı çalışan bir artı eşittir operatöre sahip olan bazı fantezi CPU'lar olabilir.


2
Teorik olarak şematik olarak. ADDBirçok CPU'lar talimatları ikinci Katılan gibi diğer kayıtlar, bellek veya sabitleri kullanarak kayıtları veya hafıza üzerinde doğrudan çalışmasına varyantlar var. Tüm kombinasyonlar mevcut değildir (örn. Hafızaya hafıza ekleyin), ancak faydalı olması için yeterli. Her halükarda, iyi bir optimize ediciye sahip herhangi bir derleyici, x = x + yolduğu gibi aynı kodu üreteceğini bilecektir x += y.
Blrfl

Bu nedenle "Contved".
Mark Canlas

5

Güzel bir deyim. Daha hızlı olup olmaması dile bağlıdır. C de daha hızlıdır, çünkü değişkeni sağ tarafa arttırmak için bir talimatı çevirir. Python, Ruby, C, C ++ ve Java gibi modern dillerin tümü op = sözdizimini destekler. Kompakt ve çabuk alışırsın. Diğer insanların kodunda (OPC) bir sürü göreceğiniz için, buna alışabilir ve kullanabilirsiniz. İşte birkaç başka dilde olan şey.

Python'da, yazmak x += 5hala tam sayı nesnesinin 1 (bir havuzdan çizilebilmesine rağmen) ve 5 içeren tam sayı nesnesinin oluşturulmasına neden olur.

Java'da tam bir döküm oluşmasına neden olur. Yazmayı dene

int x = 4;
x = x + 5.2  // This causes a compiler error
x += 5.2     // This is not an error; an implicit cast is done.

Modern zorunlu diller. (Saf) fonksiyonel dilde x+=5olduğu kadar az anlama sahiptir x=x+5; Haskell örneğin ikincisi yok değil neden x5 artırılabilir için - bunun yerine sonsuz özyineleme döngü doğurur. Kim bunun için steno ister?
leftaroundabout

Modern derleyicilerde mutlaka daha hızlı olması gerekmiyor:
C.'de

İşlemci bağımlı +=olduğu için hızı hızı dile bağlı değil . Örneğin, X86 iki adresli bir mimaridir, yalnızca yerel olarak desteklemektedir . Bunun gibi bir ifade derlenmelidir çünkü toplama işleminin sonucunu, basametlerden birinin yerine başka bir yere koyacak hiçbir talimat yoktur. Güç mimarisi, aksine, özel komutları olmayan üç adres mimarisidir . Bu mimaride, ifadeler ve her zaman aynı kodu derler. +=a = b + c;a = b; a += c;+=a += b;a = a + b;
cmaster

4

Gibi operatörler +=, bir akümülatör olarak bir değişkeni , yani toplam çalışmayı kullanırken çok yararlıdır

x += 2;
x += 5;
x -= 3;

Okumak için çok daha kolay mı:

x = x + 2;
x = x + 5;
x = x - 3;

İlk durumda, kavramsal olarak, içindeki değeri değiştiriyorsunuz x. İkinci durumda, yeni bir değer hesaplıyor ve xher seferinde atarsınız . Muhtemelen asla bu kadar basit kod yazmazken, fikir aynı kalır ... odak noktası, yeni bir değer yaratmak yerine mevcut bir değere yaptığınız şeydir.


Benim için tam anlamıyla tam tersi - ilk değişken ekrandaki kir gibi ve ikincisi de temiz ve okunaklı.
Mikhail V

1
Farklı insanlar için farklı vuruşlar, @MikhailV, fakat programlamada yeniyseniz, bir süre sonra görüşünüzü değiştirebilirsiniz.
Caleb

Programlamada o kadar yeni değilim, sadece uzun bir süre boyunca + = gösterime alıştığınızı ve bu yüzden bunu okuyabildiğinizi düşünüyorum. Bu, başlangıçta herhangi bir iyi görünümlü sözdizimi yapmaz, bu nedenle boşluklarla çevrili bir + operatörü + = ve tümüyle ayırt edilemeyen arkadaşlar nesnel olarak temizleyicidir. Cevabınızın yanlış olduğunu değil, ancak alışkanlıklara çok fazla güvenmemeli, tüketimleri ne kadar "okunması kolay".
Mikhail V

Benim düşüncem, ifadenin daha kompakt hale getirilmesinden ziyade, yeni değerlerin biriktirilmesi ve depolanması arasındaki kavramsal farkla ilgili olduğudur. Çoğu zorunlu programlama dili benzer operatörlere sahiptir, bu yüzden onu yararlı bulan tek kişi gibi görünmüyorum. Ama dediğim gibi, farklı insanlar için farklı vuruşlar. Eğer beğenmediysen, kullanma. Tartışmaya devam etmek istiyorsanız, belki de Yazılım Mühendisliği Sohbeti daha uygun olacaktır.
Caleb

1

Bunu düşün

(some_object[index])->some_other_object[more] += 5

D0 gerçekten yazmak istiyorsun

(some_object[index])->some_other_object[more] = (some_object[index])->some_other_object[more] + 5

1

Diğer cevaplar daha yaygın vakaları hedef alır, ancak başka bir neden daha vardır: Bazı programlama dillerinde aşırı yüklenebilir; örneğin, Scala .


Küçük Ölçek dersi:

var j = 5 #Creates a variable
j += 4    #Compiles

val i = 5 #Creates a constant
i += 4    #Doesn’t compile

Bir sınıf sadece +operatörü tanımlarsa x+=y, aslında kısayoldan ibarettir x=x+y.

Bir sınıf aşırı +=yüklenirse, bunlar:

var a = ""
a += "This works. a now points to a new String."

val b = ""
b += "This doesn’t compile, as b cannot be reassigned."

val c = StringBuffer() #implements +=
c += "This works, as StringBuffer implements “+=(c: String)”."

Ek olarak, işleçler +ve +=iki ayrı işleçtir (ve yalnızca bunlar değil: + a, ++ a, a ++, a + ba + = b de farklı işleçlerdir); Operatör aşırı yüklenmesinin mevcut olduğu dillerde, ilginç durumlar ortaya çıkabilir. Yukarıda açıklandığı gibi - +ekleme işlemini yapmak için operatörü aşırı yükleyecekseniz, aşırı yüklenmesinin de gerekli olduğunu unutmayın +=.


"Bir sınıf sadece + işlecini tanımlarsa, x + = y gerçekten de x = x + y kısayolu olur." Ama elbette bunun tersi de işe yarıyor mu? C ++ 'da ilk önce tanımlamak +=ve sonra a+b"kopyasını yapmak a, bkullanmak üzerine koymak +=, kopyasını döndürmek " olarak tanımlamak çok yaygındır a.
leftaroundabout

1

Bir kere ve sadece bir kere söyle: in x = x + 1, iki kere 'x' diyorum.

Ama 'a = b + = 1' yazmayın, yoksa 10 yavru kedi, 27 fare, bir köpek ve bir hamster öldürmek zorunda kalacağız.


Bir değişkenin değerini asla değiştirmemelisiniz, çünkü kodun doğru olduğunu ispatlamayı kolaylaştırır - işlevsel programlamaya bakın. Ancak yaparsanız, o zaman sadece bir kez şeyler söylemek daha iyidir.


"bir değişkenin değerini asla değiştirmez" İşlevsel paradigma ?
Peter Mortensen
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.