C 語言的賦值表示式,如 i 為什麼會有值?

時間 2021-05-07 03:12:03

1樓:無弦月

首先分清楚表示式和語句。

表示式就和數學上表示式類似都是有返回值的而語句就沒有。

比如++i i++ a=a+1這種都是表示式,都要有值,而++i; i++;這種都是語句,如果有返回值也忽略。

表示式是由操作符和運算元組成的。

樓主去了解下函式式程式設計把,比如scheme類似的

2樓:

你都說了,它叫賦值「表示式」,自然有值。

注意表示式和語句的區別。並且不同語言,規則可能不同。比如有的語言將if else搞成了表示式,反倒賦值變成了語句。

3樓:不一樂乎

因為賦值表示式也是表示式,而所有的表示式都是可以求值的。比如對3+5可以求值,對a=8也可以求值,對i=i+1 自然也是可以的。

4樓:「已登出」

因為(i++)是乙個表示式,而表示式具有值。

在C的設計中,(i++)這樣的表示式具有和i同型別的值。(i+=1)和(i=1)也都是表示式。

C的確也是有不屬於表示式的語句的,比如(int i)。

你可以認為將(i++)規定為表示式,並令其具有有意義的值是C的設計失誤。

然後,相容是萬惡之源。

所以新的程式語言大都傾向於令賦值表示式的值為空/令賦值表示式不具有值/將賦值語句排除在表示式之外。

此外也有不提供++ --甚至不提供的做法。

5樓:海淀遊民

沒太看懂題主在質疑什麼。絕大部分通用CPU 都有自增一和自減一兩條指令,在編譯器技術還比較糙的時代為了執行速度就給 C 語言裡對應的新增了 ++ 和 —兩個運算子,現代編譯器會把 i = i + 1 的語句翻譯成 CPU 自增指令。

6樓:格格巫

++ 也是運算子 ,有這樣簡寫的原因是自增使用場景很高,i++ 和 i=i+1 雖然結果一樣,但對編譯器來說不一樣

i=i+1 對計算機來說先要解析i+1 ,然後計算,再賦值給 i ,注意2個i 的位址空間不一樣,他們是在值之間操作(通用的計算表示式)

i++ 是直接i 位址值上自增 1,只用了1個位址 (特定的計算表示式,僅對自身操作)

現代編譯器對自增1 的情況計算效率其實差不多 i++ 和 i=i+1

類似這樣的情況還有某些情況下你可以用移位運算來代替除以2

另外你也說了運算是有返回值。這樣設計是方便要使用返回值的時候能夠有,如果砍掉,那麼就相當於要設計2個,乙個是有返回值的運算乙個是沒有返回值的運算。建議在日常程式設計過程中都最好帶返回值,方便排錯和判斷。

當然以上是我瞎編的。

7樓:城南花已開丶

程式設計其實取的是side effect,幾乎每個表示式都是有返回的,只是你沒有注意到罷了。很多時候這種side effect會帶來一些意想不到的錯誤所以近年出現的一些高階語言都遮蔽了這一特性,比如swift。

8樓:OFFLINE

因為這是設計出來的.

就和奧特曼的世界有怪獸一樣, 不要問為什麼有, 要問就問為什麼這樣設計.

當然了, 不要問我, 問最開始發明++的人吧. 也許他會回答 "我喜歡呀"

C語言的表示式求值順序問題?

Ming Wu 這個問題是個好問題。前面的朋友說得好,優先順序和求值的先後順序,確實是兩回事。我打個比方,優先順序好像古文裡面的斷句法,決定了何處實際上等於加上了括號。但斷句怎麼斷,不都是還要從左向右 或者從右向左 閱讀句子麼?閱讀的順序不受到斷句法的影響的。在程式設計中,我確實對 if y!0 x...

為什麼使用正規表示式會慢?

這題我知道,我來答一下。因為有的正則引擎使用NFA來做字串匹配,NFA有很多不同的路徑,當嘗試的某一路徑錯誤的時候就要回溯到前一狀態,嘗試其他路徑,所以時間複雜度較大。不知道是否有正則引擎用DFA來實現,DFA是最大匹配原則,只用跑一遍字串即可,時間複雜度與字串的長度相關,但是實現麻煩成本高。 已登...

為什麼這 4 個表示式得到了結果會不同?

rainyssss 相同的word size型別比較時型別轉換保持bit pattern不變將signed轉化為unsigned進行比較因此 5 與 unsigned 2比較時將 5 0xfffffffb 解釋為4294967291 不同的word size型別比較時型別轉換不能維持bit patt...