0

こんにちは、私は StringBuffer と StringBuilder をいじっていました。これは、その仕組みを理解するために書いた小さなプログラムです。ただし、Stringbuffer に関連するものではなく、for ループ内のマルチ if else if ステートメントに関連する奇妙なことが起こりました。

私の小さなコード:

public class c
{
public static void main(String args[])
{
    StringBuffer infixB = new StringBuffer();

    String infix = "3/8";

    for(int i = 0; i < infix.length(); i++)
    {
        infixB.append(infix.charAt(i));
    }

    infixB.append(')');

    System.out.println("Your current infix expression: "+infixB.toString());

    //go through the 'infixB' 1 position at a time
    for(int i = 0; i < infixB.length(); i++)
    {
        if(infixB.charAt(i) == '3')
        {
            System.out.println("Digit 3 at: " +i);
        }
        else if(infixB.charAt(i) == '/')
        {
            System.out.println("Operator at: "+i);
        }
        else if(infixB.charAt(i) == '8')
        {
            System.out.println("Digit 8 at: "+i);
        }
        else if(infixB.charAt(i) == ')');
        {
            System.out.println(") found at: " +i);
        }
    }

}
}

予想される出力は次のようになります。

Your current infix expression: 3/8)
Digit 3 at: 0
Operator at: 1
Digit 8 at: 2
) found at: 3

ただし、世界は完全に丸いわけではないため、出力は次のようになりました。

Your current infix expression: 3/8)
Digit 3 at: 0
) found at: 0
Operator at: 1
) found at: 1
Digit 8 at: 2
) found at: 2
) found at: 3

ご覧のとおり、何らかの理由で for ループ内の最後の else if ステートメントは、前の if または else if ステートメントが既に実行された後でも実行されていました。

4

2 に答える 2

7

最後の条件の最後にセミコロンがあります。Java はそのセミコロンを条件の本体として扱い、中括弧内のブロックを無関係なブロックとして常に実行します。変化する

else if(infixB.charAt(i) == ')');

else if(infixB.charAt(i) == ')')
于 2013-11-14T18:29:47.983 に答える
0
{
  System.out.println(") found at: " +i);
 }

このコードにはif条件がないため、forループ条件で毎回表示されます

于 2013-11-18T09:19:52.370 に答える