iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 6
3
Software Development

提神?看程式比喝咖啡更有效。系列 第 6

i++ 與 ++i可以怎麼理解?

  • 分享至 

  • xImage
  •  

我們常常看到for loop出現i++++i,但不管是使用哪一種,結果都沒有差別。
所以i++++i是相同的東西嗎?
當然不是,如果我們直接使用i++++i,兩者的輸出是相等的。(可以先理解為相同
我們直接看看程式

int main(){
int A=2;
int B=2;
A++; 
++B; 
printf("A=%d  B=%d \n",A,B);
return 0;
}

https://ithelp.ithome.com.tw/upload/images/20171221/201078181PDiC2gnoL.png
兩者A與B的輸出均是3
但只要我們是以表示式來使用,效果就不一樣了。

int main(){
int A = 2;
int B = 2;
int C = A++; 
int D = ++B; 
printf("C=%d  D=%d \n",C,D);
return 0;
}

https://ithelp.ithome.com.tw/upload/images/20171221/20107818LiCWreXJ6d.png
A++:意思是先把A放到C,再執行A=A+1 的動作。
因為A先放到C,所以C的值會是2
++B:意思是先再執行B=B+1,再把B放到D。
因為B會先執行B=B+1的動作,所以D的值會是3

=============分格線=============

那我出例題,看大家能不能算出正確的值

int main(){
int A=2 , AA=0;
int B=2 , BB=0;

AA = (A++) + (A++);
BB = (++B) + (B++);
 
printf("A=%d   B=%d\n",AA,BB);
return 0;
}

在**=** 的右端,我們從左往右看
AA = (A++) + (A++);
左方的A++ : 是指先執行A=2,下一次再執行A=A+1
右方的A++ : 由於**左方的A++**所輸出的值是2,因此在此處的A也是2。同樣地,先執行A=2,下一次再執行A=A+1
(A++) + (A++) : 左方的A++右方的A++,也均為2,所以我們可以理解為AA=2+2,所以AA值為4
=============

BB = (++B) + (B++);
左方的++B : (已知B=2)是指先執行B=2+1,所以B=3
右方的B++ : (目前B=3)是指先執行B=3,下一次再執行B=B+1
(++B) + (B++) : 左方的++B右方的B++,也均為3,所以我們可以理解為BB=3+3,所以BB值為6

https://ithelp.ithome.com.tw/upload/images/20171222/20107818Z9xuwaldCg.png

=============分格線=============

但覺得很少人會同一個表示式連續用2次,而且可讀性不高,注腳不方便。
我記得有一位工程師說過:以前很喜歡用int A=0,B=0,C=0;,一整行宣告所有變數
但當上工程師後就會很討厭這種寫法,會把每一變數單獨宣告

int A=0;   //XXXXXX
int B=0;   //XXXXXX
int C=0;   //XXXXXX

因為這樣比較好理解,注腳也比較方便


上一篇
如何在學弟妹前裝帥 [2]windows分享WIFI
下一篇
陣列中找出正方形 [1]簡說&與&&、|與||
系列文
提神?看程式比喝咖啡更有效。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

5
m10517020
iT邦新手 5 級 ‧ 2021-02-19 15:07:35

您好,我自己跟著實作一次,但是結果不一樣耶,如下:
AA=5
BB=7
我自己的理解是:
AA = (A++) + (A++);
第一次A++時,A還是保持為2
在第二次A++前,A已經變成3,所以最後A會是4
而AA=2+3=5

BB = (++B) + (B++);
這部分我就始終不理解為什麼會是7? 而不是BB=3+3=6?
希望能幫我解惑,謝謝

a tseng iT邦新手 5 級 ‧ 2022-08-15 10:51:35 檢舉

https://iter01.com/567099.html
我也探討這ㄍ問題一陣子
這篇的作者探討的很仔細
應該可以幫您解惑
以下為文章內容
C語言創始人明確指出:
自增與自減運算只能作用於變數,類似於(i+j)++是非法的,因為自增運算包含了賦值運算,而表示式不能作為賦值運算的左值。

所以,在這裡(i++)+(i++)也是非法的,因為在前一個i++的作用下,後面的i就已經是表示式了,表示式不能再做++操作

同理 (++i)+(i++)本身是非法的
但編譯器關係其實本身是可以計算的
所以才會有那麼畸形的結果

我要留言

立即登入留言