伊莉討論區

標題: 關於++ --以及函數問題 (已解決) [打印本頁]

作者: 在那裡    時間: 2018-9-18 04:21 PM     標題: 關於++ --以及函數問題 (已解決)

本帖最後由 在那裡 於 2018-9-18 06:50 PM 編輯

小弟我在寫後續式運算時遇到了一個問題

程式碼如下:
#include <iostream>

using namespace std;
int count(int a,int b,char oper)
{
    switch(oper)
    {
        case '+': return a+b;
        case '-': return a-b;
        case '*': return a*b;
        case '/': return a/b;
        case '%': return a%b;
        default : return 0;
    }
}


int main()
{
    int Stack[4] = {1,2,99,97};
    int top = 3;

    int a,b;
    b = Stack[top--];
    a = Stack[top--];
    Stack[++top] = count(a,b,'-');
    //Stack[++top] = count(Stack[top--],Stack[top--],'-');

    cout << "top:" << top << endl;
    for(int i=0;i<4;i++)
        cout << "Stack[" << i << "]:" << Stack << endl;
return 0;
}


為什麼用b與a去操作就可以成功運作,而註解內的那一行就會產生錯誤結果呢?


to snowflying:痾 難道不是由右往左?





作者: jackyo04    時間: 2018-9-18 04:59 PM

C語言的原則,也是我一開始遇過的問題,前輩的回答是:先有雞還是先有蛋..
有時候為了方便會懶得去使用函數,也懶得去宣告..但C語言沒有那麼聰明XD
別為了一時方便而沒去宣告,有些Bug就是因為這些原因而產生的...
我之前也常遇到,改過這個習慣後就不會有這個問題了
作者: advantise    時間: 2018-9-18 06:28 PM

這個是stack overflow, 你宣告 Stack[4] , 但是 ++top, 已經變成4, 超過範圍了, 而你宣告int a, b去接值時, 在stack又多宣告了2個int的位置, 所以用++top後你的stack會用到a或b的位置, 你可以把a, b的值print出來, 就知道了。
作者: 在那裡    時間: 2018-9-18 06:50 PM

也就是說,程式是先進行Stack[++top]左邊的式子,而非先進行count(Stack[top--],Stack[top--],'-')右邊的式子囉?那大概懂了。

嗯......還是不要使用這種模糊的運算式好了@A@
謝謝~
作者: z1090128    時間: 2018-9-25 09:20 PM

top的初始位置是3,也是你矩陣最大的那個位置,在你使用++top時就超出了矩陣的大小了
作者: johnwanz    時間: 2018-9-26 09:13 AM

簡單說, 單一行敘述句內, 同時對一個變數, 又++又--, 有超過一次的賦值動作, 印象裡, 這在標準上是屬於未定義行為, 故不同編譯器可能產生不同的結果. 即便恰好得到了想要的結果, 也只能說是運氣.

基本上, 應避免在同一敘述句內, 同時有多次的++/--. 寫程式應該要靠邏輯, 而不是運氣.





歡迎光臨 伊莉討論區 (http://www06.eyny.com/) Powered by Discuz!