4

私は csc からこのコードへの反応に困惑しています:

{
  int i;
  if (false)
  {
    i++;                // uninitialized, but allowed by compiler
  }
  if (false && i < 30)  // uninitialized, but allowed by compiler
  {
  }
  if (false && i < 30)  // uninitialized, but allowed by compiler
  {
    i++;                // NOT ALLOWED by compiler??
  }
}

このコードには、3 つifの s と 1 つの初期化されていないローカル変数 i があります。CSC は、i が使用されている場所に到達できないことをコードに伝えることができるため、最初と 2 番目のケースでの i の使用を許容するほどスマートです。しかし、3 番目のケースでは、i のインクリメントについて「割り当てられていないローカル変数 i の使用」について不平を言っています。最初の 2 つの if で i が到達不能コードにあることを正しく検出しているのに、3 番目の if では正しく検出していないのはなぜですか (これは最初の 2 つのケースの組み合わせにすぎないのですか?

4

1 に答える 1

7

これは、C# 5 仕様のセクション 8.7.1 で説明されています。

ステートメントが到達可能で、ブール式が定数値を持たないif場合、ステートメントの最初の埋め込みステートメントは到達可能です。iffalse

この条件は次のように推論できますが、

false && i < 30

は常にfalseであり、言語の規則 (7.19) によると定数式ではないため、本文の最初の埋め込みステートメントに到達できます。

関係するすべてが&&偽ではないというわけではありません。たとえば、これで問題ありません。

if (false && true)
{
    i++;
}

...しかし、式i < 30が定数ではないため、元の式は定数ではありません。これは、expression が決して評価されないことがわかっている場合でも当てはまります

言語は、LHS の定数式が である式は、値 の定数式でもあると判断できますが、そうではありません。(複雑さが少し増えるだけですが、メリットのレベルは非常に小さいです。)&&falsefalse

于 2013-05-11T18:29:21.003 に答える