4

ユーザーが繰り返す質問のリストがあります。どの質問からでも開始できますが、順序はあります。そのため、配列へのインデックスを維持し、次のようにインクリメントします。

CurrentQuestion = (++CurrentQuestion < questions.Length) ? CurrentQuestion : 0;

ここで何が起こっているのかは必ずしも明らかではありませんが、これを行うためのよりエレガントな方法はありますか?

4

3 に答える 3

12

++私は、変数を使用してから、同じステートメントでその変数を再度使用することに強い嫌悪感を抱いています。この行は C# では正常に機能すると思いますが、このような行は C/C++ では定義されていないため、フラグが立てられます。を好む

CurrentQuestion = (CurrentQuestion+1) % questions.Length;

これは、C に似た言語で時計演算を行う慣用的な方法だと思います。

于 2012-06-15T20:07:25.103 に答える
3

ここで何が起こっているのかは必ずしも明らかではありませんが、これを行うためのよりエレガントな方法はありますか?

一部の人にはすぐにはわかりませんが、私はそれが何をしているのかを正確に知っています。

ただし、考慮したいのは、賢いことよりも読みやすいコードを書くことの方が重要だということです。コードを維持する必要があり、コンパイラより賢くはありません。

このようにコードを書いて、満足してください。

//ensure that the CurrentQuestion counter increments and loops back around after hitting "list max"
CurrentQuestion = CurrentQuestion + 1;
if (CurrentQuestion >= questions.Length) {
  CurrentQuestion = 0;
} // meta-comment: use braces incase you have to add more later

重要な点は、このコードが読み取り可能になり、まだ最適化されていることです。これは他のコードとまったく同じように機能し、コードを何度も読み直さなくても後でパーツを変更できます。

ここで使用したセマンティクスにも注意してください。

  • 中かっこは、必要ないと思われる場合でも、常に使用してください。
  • またはのCurrentQuestion = CurrentQuestion + 1;代わりに実行してください。最初の方が意図がはるかに明確だからです。常に意図的なコードを書いてください。CurrentQuestion += 1;CurrentQuestion++;++CurrentQuestion;
于 2012-06-15T20:03:35.947 に答える
0

条件演算子は必要ありません

 CurrentQuestion = ++CurrentQuestion % questions.Length;

でもどちらを好むかは何よりもスタイルの問題だと思います

于 2012-06-15T20:08:51.373 に答える