1樓:XIVN1987
1、容易替代
n++很容易被替代為:
n += 1
2、功能有限
只能實現自增1,想要自增2怎麼辦?還不是得寫成:
n += 2
所以乾脆去掉自增用+=替代算了
2樓:路公尺
關於Ruby的這個特性,松本先生本人解釋過這個問題:
[ruby-list:126] Re: i++ ????
我們先預設 i 是乙個Integer。如果要在Ruby裡面實現 i++ 的話,按照Ruby的風格應該被理解成是『向 i 所指的物件傳送++訊息,該物件的值變為下乙個值』。但是問題就在於整型在Ruby裡面並不是乙個物件,而是乙個立即值。
也就是說 i 的值是直接存在這個變數裡面而不是先建立乙個整型物件然後用 i 指向它(這樣應該是出於效能考慮)。這樣就無法用訊息傳送的模型來處理 i++ 這個動作了,所有和這類整型有關的讀寫操作都是另外實現的。
所以如果要加上 i++ 特性的話,要麼把整數物件化,但是這樣並沒有太大的意義,而且效能還可能會下降。要麼再給整數特地加上這個功能,但是這樣其他型別是不是也要加上++操作符呢(而且實現模型還不一樣,這是需要訊息傳送的)?但是大多數型別並不需要這個自增的語義(我能想到的就只有數字和迭代器可能會需要),為了這個特性修改語法解析規則帶來的收益太小,沒有意義。
況且和Python一樣,Ruby的數字是immutable的,i++這樣修改變數值的動作本來就是做不到的。
3樓:冒泡
以py為例
如果要實現也很容易,不過需要注意,跟賦值一樣,在py中自增自減得是乙個語句,而並不能成為其他表示式的一部分,能連續賦值是因為py有特殊支援這種語法,就像樓上乙個答案說的,a=b=c不代表a=(b=c)
另外有些答案說,py中a+=b相當於a=a+b,其實這也是不對的,比如list的+=相當於extend,而list的+是生成了新物件,python實際上是這樣實現的:
a=a+b <===> a=a.__add__(b)
a+=b <===> a=a.__iadd__(b)
可以看到是不同的運算子內建方法,完全可以實現為不一樣的邏輯(比如整數的__iadd__就直接呼叫__add__,所以等價,而list的則實現不同,且__iadd__裡面return的是self,於是就跟extend一樣了,只是多一次多餘的賦值,因為這個賦值是為了保證實現模型一致)
所以自增自減其實很容易實現:
++a <===> a=a.__inc__()
--a <===> a=a.__dec__()
__inc__和__dec__跟上面說的一樣,return self即可,當然也可以不return self,這樣自由度更大,比如乙個變數a在自增過程中出現一些情況,結果變成None了都可以
因為作為語句,所以前++還是後++沒啥區別,當然py沒有提供這倆,可能是作者不喜歡,也可能是其他原因,總之理論上如果有了上面的限定,實現這倆本身沒啥難度
4樓:
個人感覺應該是自增運算子沒有意義吧。因為Python裡int型別的值其實是不可改變的,賦值只是將引用賦給了另乙個物件。
#python 3a=
2333
print('
{}@{}'
.format(a
,id(a
)))a+=1
print('
{}@{}'
.format(a
,id(a
)))可以看出雖然變數名仍然叫a,但在記憶體的位址卻已經改變了。物件都不是原來的物件了,何來自增之說?
相對的,在C++中//C++ 11
inta
=2333
;std
::cout
<
< endl;++ a;std:: cout <
< endl;a +=1;std ::cout <
< endl ;a的位址是不會變的,程式將新值仍放在原來的位址中。不過,自增自減運算子也不是只能用於數值運算,C++中STL的iterator也可以用++/--,還是挺方便的,在引入Ranged for statement之前都要依賴這種方法來遍歷容器。 初學python,一點淺見還請指教! 5樓:BariaGrr 好多人說是因為物件什麼的… 但i++可以當作i+=1的語法糖不是嗎… 主要是因為Python和Ruby下有超好用的迭代器導致自增沒那麼常用了吧… 順便知乎新版客戶端發個回答卡五次還差點給我全刪了…… 6樓:Henry Zhao >>> b = 5 >>> a = 5 >>> id(a) 162334512 >>> id(b) 162334512 >>> a is b True 「可以看出, python 中,變數是以內容為基準而不是像 c 中以變數名為基準,所以只要你的數字內容是5,不管你起什麼名字,這個變數的 ID 是相同的,同時也就說明了 python 中乙個變數可以以多個名稱訪問」 -------上面這句並不正確。感謝 @la.onger指教,如他所說: int理論上是每次賦值都建立乙個新物件的。但是由於使用頻繁,為了提公升效能避免浪費,所有python有個整數池,預設1~256的數字都屬於這個整數池,這些每次賦值的時候,是取得池中的整數物件。但是其他的除外,如: >>> a = 257 >>> b = 257 >>> id(a) 140397570652784 >>> id(b) 140397570652736 「這樣的設計邏輯決定了 python 中數字型別的值是不可變的,因為如果如上例,a 和 b 都是 5,當你改變了 a 時,b 也會跟著變,這當然不是我們希望的」 -------這句也是錯誤的。改變a時,b並不會跟著改變,如 鄭程所說。如: >>> a=5 >>> b=5 >>> a+=1 >>> a >>> b 關於 python 的自增運算 c2002ncut 先來了解一下英語的歷史 為什麼英文發音拼寫規則雜亂?一起梳理這段英語史 總體來說,包括以下幾條 一 諾曼征服改變了英語的拼寫,還大量引進了法語詞彙。二 母音大推移 中拼寫沒有隨發音改變,而在此過程中還發生了其他一些變化。從14世紀到17世紀,英語發生了不明原因的 母音大推移 很多... 紙婷是英語老師 不奇怪啊,有母音有子音就會這樣啊,其他語不清楚不過西語說快了也會語流音變啊,比如委內瑞拉那邊的西語好多音都被帶過去了。其實音變說白了就是大家說話說累了肌肉放鬆了想省省事 俄語裡的 在非重讀情況下讀作 而 本身也發生了音變 同情況下讀作 i g 則是把之前兩個子音 g 和 h 合二為一... Olympiodorus 談一談個人觀點,不一定準確,僅供參考。由於我對烏加裡特語的了解實在太少,就不發表意見了,這裡只提腓尼基語。1.根據同為迦南諸語的希伯來語進行推測。由於有Niqqud拼音標記的緣故,古典希伯來語的母音儲存得較為完好。希伯來語和腓尼基語均受到了迦南音移 Canaanite Sh...為什麼法語 俄語 德語 西班牙語等語言可以直接拼讀,英語就要用音標?
為什麼英語有音變現象,而德語 義大利語等字母語言就沒有類似的現象呢?
腓尼基語 烏加裡特語等古代閃族語言的母音是如何推測出來的?