全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1416
推到 Plurk!
推到 Facebook!

請教C\C++,遞增、遞減運算子的問題?

尚未結案
evil666
一般會員


發表:3
回覆:4
積分:1
註冊:2004-09-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-26 10:47:52 IP:61.222.xxx.xxx 未訂閱
請問為什麼 a = a - b - c - a --b - a-- 運算出來的結果會是 -6 呢? 小弟只知道, 或 --在前面要先算,在後面要後算。 算式短的話,小弟還算的出來為什麼, 但…算式長一點(像問題那樣)就真的不太懂了耶? 能不能麻煩一下板上的先進們,幫忙一下小弟… 看能不能將 a = a - b - c - a --b - a-- 拆成一行一行的運算式,盡量不要精簡…小弟很想弄懂它 @___@"
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-26 13:06:44 IP:59.104.xxx.xxx 未訂閱
有意義嗎? 把這個東西搞懂。 你正式寫程式。一輩子不會用到。@.@
powmien
初階會員


發表:27
回覆:80
積分:41
註冊:2004-10-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-26 17:50:56 IP:60.248.xxx.xxx 未訂閱
弄懂這種東西其實如 暗黑前輩 所說,是沒什麼用的阿... 不過這種東西應該考式用的到吧= = 遇到這種題目第一步就是加括號(俗話說:括號加的好,要飯要到老是嗎?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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-27 01:02:55 IP:61.229.xxx.xxx 未訂閱
抱歉…小弟沒說清楚問題… 問題是這樣的 a=b=c=3 a = a - b - c - a --b - a-- 感謝powmien,能麻煩在拆細一點點嗎…小弟真的還是不大懂。(抱歉 而且 、--在前不是要先算?在後面要後算。 但看不太出powmien大有哪邊先算,哪邊後算? to:暗黑破壞神大大 原來這個真的不常用啊 @__@" 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-27 08:50:43 IP:59.104.xxx.xxx 未訂閱
引言: 原來這個真的不常用啊 @__@" 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……
, -- 它常用 但是不是這樣用。 最多只用到這樣。
char buffer[1000];
char *cp = buffer;
strcpy(buffer, "This is a test string");
while (*cp   != '\0')
    ;
而不是你那種用法。 大概只有無聊的老師才會考這個。 該會的不會。不該會的會一拖拉庫。
powmien
初階會員


發表:27
回覆:80
積分:41
註冊:2004-10-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-27 11:49:12 IP:218.160.xxx.xxx 未訂閱
引言: 抱歉…小弟沒說清楚問題… 問題是這樣的 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-27 11:55:44 IP:218.160.xxx.xxx 未訂閱
引言: 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……
其實效率不是 程式 寫的短 寫的漂亮就一定等於效率好的 寫的漂亮只是讓別人易讀自已易維護 寫的短是以為會有人喜歡比看誰寫的短,誰寫的讓別人看不懂. 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。
evil666
一般會員


發表:3
回覆:4
積分:1
註冊:2004-09-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-28 00:26:42 IP:220.136.xxx.xxx 未訂閱
引言:
引言: 小弟以為這種東西拿來寫,會提升程式的執行效率說… 那請問,這些運算子會常用嗎? ^、&、|、 =、&= ……
其實效率不是 程式 寫的短 寫的漂亮就一定等於效率好的 寫的漂亮只是讓別人易讀自已易維護 寫的短是以為會有人喜歡比看誰寫的短,誰寫的讓別人看不懂. 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。
會認為效率好是因為,老師說 <<、>> 這種位移位元的運算子 善用的話,可以提升執行效率(因為直接對位元做運算) 所以小弟才會想說… 、 -- 也是同樣的道理 @__@" 其實小弟上學期學習的是VB,覺的還滿有趣的, 當然這學期的C/C 也很有趣(但運算子還真多種類@_@",滿多語法要記的~) 而這學期也要學 JAVA、C/C 、JAVASCRIPT … 真不知道,一次學三種到底效果會… 總之,感謝各位了!以後還請多指教~ ^__^" P.S 抱歉哦!小弟又說錯了。 a = a - b - c - a --b - a-- 應該是 a = -5,b = 3,c = 3 #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 = -5 b = 3 c = 3 a = a - b - c - a --b - a-- 這個才是 a = -6,b = 3,c = 3
powmien
初階會員


發表:27
回覆:80
積分:41
註冊:2004-10-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-28 00:51:28 IP:218.160.xxx.xxx 未訂閱
引言: 會認為效率好是因為,老師說 <<、>> 這種位移位元的運算子 善用的話,可以提升執行效率(因為直接對位元做運算) 所以小弟才會想說… 、 -- 也是同樣的道理 @__@" 其實小弟上學期學習的是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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-28 04:04:39 IP:218.103.xxx.xxx 未訂閱
剛好路過看到好像有點不對勁就來回一下=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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-28 13:35:40 IP:59.112.xxx.xxx 未訂閱
引言: 剛好路過看到好像有點不對勁就來回一下=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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-28 17:16:31 IP:219.76.xxx.xxx 未訂閱
偶明白了 powmien兄的是先內存 然後以內存了的值來代入公式 so... a=4+(4-2-3-4+2-4) a=-3 而偶的 a=3+3-3-3-4+2-3 所以a才會得到結果-5 沒有甚麼天才不天才=3= 肯努力虛心學習 用對方法就好了=3=+
------
沒有甚麼天才不天才=3=
肯努力虛心學習
用對方法就好了=3=+
powmien
初階會員


發表:27
回覆:80
積分:41
註冊:2004-10-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-28 17:55:56 IP:59.112.xxx.xxx 未訂閱
引言: 偶明白了 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 天下英雄出我輩,一入江湖歲月催; 皇圖霸業談笑中,不勝人生一場醉。
系統時間:2024-06-29 16:42:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!