2011-11-09 22 views
4

私は絶対に正常に動作し、私はpostからもらったswitch文を使用して、このコードを持っている:switch文では、すべてのケースがなぜ実行されていますか?

String getOrdinal(final int day) { 
    if (day >= 11 && day <= 13) { 
     return "th"; 
    } 
    switch (day % 10) { 
     case 1: return "st"; 
     case 2: return "nd"; 
     case 3: return "rd"; 
     default: return "th"; 
    } 
} 

を私はこのようなものに変更した場合ケース1以外のすべてのケースがにつれて、それは、壊れます実行:私は「2」に渡すとき

static String getOrdinal(final int day) { 
    StringBuilder ordinalBuilder = new StringBuilder(); 
    ordinalBuilder.append("<sup>"); 
    if (day >= 11 && day <= 13) { 
     ordinalBuilder.append("th") ; 
    } 
    switch (day % 10) { 
     case 1: ordinalBuilder.append("st"); 
     case 2: ordinalBuilder.append("nd"); 
     case 3: ordinalBuilder.append("rd"); 
     default: ordinalBuilder.append("th"); 
    } 
    ordinalBuilder.append("</sup>"); 
    return ordinalBuilder.toString(); 
} 

これは2<sup>ndrdth</sup>を印刷し、私はバッファにビルダーが、同じ応答を変更しようとした。これはバグか、私はいくつかのミスを作っていますだろうか?

+3

switch文をインライン展開しても何も得られないので、 'getOrdinal'メソッドを別々にしておき、あなたのコードでそれを呼び出さなければなりません。コードに11,12、または13を渡してみてください。あなたが作成した別のバグがあります。 –

+1

@TimBenderに+1を与えることができたらいいですか?この質問は、カーゴ・カルト・プログラミングの定義です。 – CanSpice

+0

R T F M。 。 。 。 。 – dokaspar

答えて

33

これはコードのバグです。あなたは、すべてのスイッチケースには「ブレーク」ステートメントを追加する必要が

switch (day % 10) { 
    case 1: ordinalBuilder.append("st"); break; 
    case 2: ordinalBuilder.append("nd"); break; 
    case 3: ordinalBuilder.append("rd"); break; 
    default: ordinalBuilder.append("th"); break; 
} 
9

:あなたはbreakcaseそれぞれの後に入れるのを忘れていました。 メソッドから戻り値が返されたため、以前は動作していました...

3

caseステートメントで続行する前に最初のバージョンが返されます。 2番目のバージョンは休憩が必要です。同一の動作を得るためにはステートメント。

18

ここでは、少なくとも言語がうまくいかないようなバグはありません。 switchステートメントの動作は、設計通りに、引数に一致するcaseラベルでステートメントの実行を開始し、ブロックの最後まで続行することです。 xあれば

switch (x) { 
    case 1: 
     // do thing 1 
    case 2: 
     // do thing 2 
    case 3: 
     // do thing 3 
    default: 
     // do nothing 
} 

は両方のもの2と3を行います2、x場合、物事1、2、および3を行いますと、あなたはおそらく探している動作を取得するには1.

あり、 (厳密には一番最後にbreakを話すことは不要であるが、私は多くの場合、習慣のうちにそれを置く)

switch (x) { 
    case 1: 
     // do thing 1 
     break; 
    case 2: 
     // do thing 2 
     break; 
    case 3: 
     // do thing 3 
     break; 
    default: 
     // do nothing 
     break; 
} 

breakcaseを終了します。

あなたが最初のコード例では、この問題を持っていなかった理由はreturnが超breakのようであるということです。それはつまりswitchブロック内の実行を終了し、breakと同じ効果がありますが、それはまたの実行を終了します全体の方法。

6

"break;"ステートメントは、特定のケースでステートメントを実行するために、ケースを互いに分離します。終了するとすぐにケースを解除します。

breakを使用しないと、コンパイラはプログラムの最後まですべてのケースの実行を継続できると考えます。

関連する問題