請教C\C++,遞增、遞減運算子的問題? |
尚未結案
|
evil666
一般會員 發表:3 回覆:4 積分:1 註冊:2004-09-22 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
弄懂這種東西其實如 暗黑前輩 所說,是沒什麼用的阿...
不過這種東西應該考式用的到吧= =
遇到這種題目第一步就是加括號(俗話說:括號加的好,要飯要到老是嗎?XD) 還有你文章的式子 a = ..... 要改成a = .... 才能正確執行喔,
所以我不確定我解的是不是您的原意......
a = a - b - c - a --b - a--
首先將式子改成
a = a - b - c - a --b - a--
然後加上括號
a = ((((a ) - (b )) - c) - ( a)) ((--b) - (a--))
接著您說算出來的結果為-6 ,因為您並沒給a、b、c 初始值
所以我只能用假設法,我假設a=b=c=6 之後請再詳見以下內容 :D
首先先注意 a 跟--b (請參考C語言的運算子優先順序)
綜合推得下面式子
a =(((7-7)-6)-7) (5-5)
簡化一
a =(((0)-6)-7) (0)
簡化二
a =((-6)-7)
簡化三
a =-13
此時因為式子 a影響 a 內存為 7
可以推得
a=7 (-13)
得到a = -6 從學校畢業後再也沒看過這種東西了,如果有解錯請高手定正,感謝。 天下英雄出我輩,一入江湖歲月催;
皇圖霸業談笑中,不勝人生一場醉。 發表人 - powmien 於 2005/09/26 17:53:08 發表人 - powmien 於 2005/09/26 17:54:29
|
evil666
一般會員 發表:3 回覆:4 積分:1 註冊:2004-09-22 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
引言: 原來這個真的不常用啊 @__@" 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……, -- 它常用 但是不是這樣用。 最多只用到這樣。 char buffer[1000]; char *cp = buffer; strcpy(buffer, "This is a test string"); while (*cp != '\0') ;而不是你那種用法。 大概只有無聊的老師才會考這個。 該會的不會。不該會的會一拖拉庫。 |
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
引言: 抱歉…小弟沒說清楚問題… 問題是這樣的 a=b=c=3 a = a - b - c - a --b - a-- 感謝powmien,能麻煩在拆細一點點嗎…小弟真的還是不大懂。(抱歉 而且 、--在前不是要先算?在後面要後算。 但看不太出powmien大有哪邊先算,哪邊後算?恩…昨天的式子我改詳細一點了。 不過初始值給3答案不是-6是-3耶.. 你可以把你自已的式子代到 VC或BCB試試 因為式子裡面有 a和 b為最優先 => a=4,b=2 a = a - b - c - a --b - a-- => a = ((((a ) - (b )) - c) - ( a)) ((--b) - (a--)) 先不看等號左邊將值代入=> ((((4 ) - (2 )) - 3) - (4 )) (( 2) - (4 )) (((2))-3)-4) (-2) ((-1)-4)-2 (-5)-2 (-7) 因為a=4=> a=4 (-7) => a=-3 因為式子裡面有a ,a-- -3 1=-2 -2-1=-3 => a = -3 因為式子裡面有b 2 1=3 => b = 3 c = 3 (c不變)所以最後 a=(-3) ,b=3, c=3 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。 |
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
|
evil666
一般會員 發表:3 回覆:4 積分:1 註冊:2004-09-22 發送簡訊給我 |
引言:會認為效率好是因為,老師說 <<、>> 這種位移位元的運算子 善用的話,可以提升執行效率(因為直接對位元做運算) 所以小弟才會想說… 、 -- 也是同樣的道理 @__@" 其實小弟上學期學習的是VB,覺的還滿有趣的, 當然這學期的C/C 也很有趣(但運算子還真多種類@_@",滿多語法要記的~) 而這學期也要學 JAVA、C/C 、JAVASCRIPT … 真不知道,一次學三種到底效果會… 總之,感謝各位了!以後還請多指教~ ^__^" P.S 抱歉哦!小弟又說錯了。 a = a - b - c - a --b - a-- 應該是 a = -5,b = 3,c = 3 #include引言: 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……其實效率不是 程式 寫的短 寫的漂亮就一定等於效率好的 寫的漂亮只是讓別人易讀自已易維護 寫的短是以為會有人喜歡比看誰寫的短,誰寫的讓別人看不懂. 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。 |
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
引言: 會認為效率好是因為,老師說 <<、>> 這種位移位元的運算子 善用的話,可以提升執行效率(因為直接對位元做運算) 所以小弟才會想說… 、 -- 也是同樣的道理 @__@" 其實小弟上學期學習的是VB,覺的還滿有趣的, 當然這學期的C/C 也很有趣(但運算子還真多種類@_@",滿多語法要記的~) 而這學期也要學 JAVA、C/C 、JAVASCRIPT … 真不知道,一次學三種到底效果會… 總之,感謝各位了!以後還請多指教~ ^__^"的確在某個條件下>> << 會提升效率 如果你今天寫 a*=2 會比a<<=1差 如果你今天寫 a/=2 會比a>>=1差 很多東西都是看地方運用的,沒有絕對的好與不好 其實程式寫久自然而然就能知道什麼地方用什麼方法會比較好了 死記的話反而不太好,共勉之。 、 -- 事實上是簡化而已,以BCB而論 a=a 1 跟a 組合語言是相同的 只是你今天打一千行a=a 1跟打一千行a 我相信你會選擇a 的吧... 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。 |
鬼真
一般會員 發表:1 回覆:2 積分:0 註冊:2005-09-28 發送簡訊給我 |
剛好路過看到好像有點不對勁就來回一下=3=
a = a - b - c - a --b - a-- 應該是 a = -5,b = 3,c = 3 /*
a=a (a - b -c - a --b -a--) 代數進去算應該是 a=3 3-3-3-4 2-3
所以a才會得到結果-5
當中的4從何來?
因為 a是先進行a 1運算然後代入去公式運算,所以是4
而a 是先進行了整個公式的運算然後才再來進行a 1,所以是3
所以a 在公式裡還是3,而 a在公式裡就是4了... 再一個簡單例子
int a=1,b=3;
b =a ; 結果會是..
b是4
a是2
這和
int a=1,b=3;
b=b a;
a=a 1;
沒分別 int a=1,b=3;
b = a;
b是5
a是2
這和
int a=1,b=3;
a=a 1;
b=b a;
沒分別 */
------
沒有甚麼天才不天才=3= 肯努力虛心學習 用對方法就好了=3=+ |
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
引言: 剛好路過看到好像有點不對勁就來回一下=3= a+ = a++ - b++ - c - ++a + --b - a-- 應該是 a = -5,b = 3,c = 3不可能是-5 ... BCB我run很多次了,樓主自已都搞混了… 可能我的解法有錯,但是BCB run出來是-3 請見圖: ---------------------------------------------------------- 我用樓主的程式run出來也是-3不是他所說的-5 #include #include using namespace std; int main(void) { int a,b,c,; a=b=c=3; a += a++ - b++ - c - ++a + --b - a--; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl; system("pause"); } a=-3, b=3, c=3 -------------------------------------------------BCB 反組譯出來的code: a += a++ - b++ - c - ++a + --b - a--; inc dword ptr [ebp-0x04] (++a) dec dword ptr [ebp-0x08] (--b) 此時a和b的內存已經改變了 mov edx,[ebp-0x04] sub edx,[ebp-0x08] sub edx,[ebp-0x0c] sub edx,[ebp-0x04] add edx,[ebp-0x08] sub edx,[ebp-0x04] add [ebp-0x04],edx dec dword ptr [ebp-0x04] inc dword ptr [ebp-0x08] inc dword ptr [ebp-0x04]天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。 發表人 - powmien 於 2005/09/28 13:40:37 發表人 - powmien 於 2005/09/28 13:44:08 |
鬼真
一般會員 發表:1 回覆:2 積分:0 註冊:2005-09-28 發送簡訊給我 |
|
powmien
初階會員 發表:27 回覆:80 積分:41 註冊:2004-10-20 發送簡訊給我 |
引言: 偶明白了 powmien兄的是先內存 然後以內存了的值來代入公式看來是compiler的差異了,這是用 VC 反組譯出來的 Code , a= -5 a = a - b - c - a --b - a--; mov edx,dword ptr [ebp-4] sub edx,dword ptr [ebp-8] sub edx,dword ptr [ebp-0Ch] mov eax,dword ptr [ebp-4] add eax,1 mov dword ptr [ebp-4],eax sub edx,dword ptr [ebp-4] mov ecx,dword ptr [ebp-8] sub ecx,1 mov dword ptr [ebp-8],ecx add edx,dword ptr [ebp-8] sub edx,dword ptr [ebp-4] mov eax,dword ptr [ebp-4] add eax,edx mov dword ptr [ebp-4],eax mov ecx,dword ptr [ebp-4] sub ecx,1 mov dword ptr [ebp-4],ecx mov edx,dword ptr [ebp-8] add edx,1 mov dword ptr [ebp-8],edx mov eax,dword ptr [ebp-4] add eax,1 mov dword ptr [ebp-4],eax 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |