2

スタックが空であるため、到達すべきではない stack.top() に到達したため、プログラムがクラッシュします。それをチェックするifがあります:

    if(!st.empty());
        //do stuff

(初期化しました

stack<int> st;

)。

しかし、スタックが空であることをデバッグで確認できますが、それでも if! 私もこのコードを書きました:

    if(st.size()>0);
        cout<<st.size();

そして、それは0を出力します!どうすれば修正できますか? ありがとう!

4

2 に答える 2

17

if ステートメントの後のセミコロンが問題です

悪い:

if(st.size()>0); // <-- this should not be here!!!!!!!!
    cout<<st.size();

適切に書き直されました:

if(st.size()>0) {
    cout<<st.size();
}

また、@ WhozCraigが指摘したように、他のステートメントにもセミコロンがあります!

悪い:

if(!st.empty()); // <--BAD!
    //do stuff

良い:

if(!st.empty()) {
    //do stuff
}

いつも!!ブランチ (if、switch) とループ (for、while、do-while) にはブラケットを使用してください!!! それは大きな利益をもたらします!(言うまでもなく、このようなブロックが括弧なしで記述されるたびに、かわいい子猫が死んでしまいます!) ALWAYS!!

たとえば、これはデバッグで1日を殺す可能性があります:

悪い:

int i=0;
...
while(i++<1000);
    doStuff(i);

良い:

int i=0;
...
while(i++<1000) {
    doStuff(i);
}

注意してください(@WhozCraigが再び指摘したように)これは完全に有効な構文であるため、セミコロンで終了する分岐およびループステートメントの問題を自動的に解決しません。

if (condition);{ ...code... } 

または

if (condition);
{ 
     ...code... 
} 

しかし、私の意見と経験では(これは完全に主観的なものです!) - 私自身、この罠に数回陥ったことがあります - 前述のステートメントの後に中括弧があるとき、私は決して間違いを犯していないことを経験しました.セミコロンをもう一度入力します。この慣習に従うことは特効薬でした。また、そこにセミコロンがあれば「珍しい文字のパターン」なので、見ただけですぐに目に留まります。

于 2012-11-10T09:40:39.510 に答える
8

if には空のステートメントしか含まれていないため、「in the if」はありません。

if(!st.empty());
        //do stuff -- that's outside the if!!!!

(背景: 構文はif (condition) blockでありblock、ステートメントまたはステートメントのブロックのいずれかです。;は空のステートメントであるため、if (...) ;「条件が満たされた場合は何もしない」ことを意味します。これは、おそらくあなたが考えていることではありません。)

あなたは書くべきです

if(!st.empty()) {
        //do stuff -- now it's inside!
}

気をつけて!書かないで

if(!st.empty()); // notice the semicolon making it wrong; without the semicolon it would be ok
{
        // outside again
}
于 2012-11-10T09:40:48.873 に答える