8

and && 演算子が評価される順序はどれですか

たとえば、次のコード

if (float alpha = value1-value2 && alpha > 0.001)
    //do something

アルファが開始されずに使用されているという例外をスローしました。&& の左側の式は常にアルファの値を最初に開始すると思っていましたが、間違っているようです

何か案が?

ありがとう

4

14 に答える 14

13

これは次のように解析されます。

if (int alpha = (value1-value2 && (alpha > 0.001)))

...&&よりも「解析の優先順位」が高いため、=これはおそらくあなたが望むものではありません。試す:

int alpha = value1-value2; 
if (alpha && (alpha > 0.001))
于 2010-01-20T16:23:59.260 に答える
11

ここでの結論は、あなたが表現しようとしているものは、それに埋め込まれているという宣言を伴う単一の論理条件ではおそらく表現できないということですalpha(他のいくつかの回答が主張しているものにもかかわらず)。

他の回答では、条件が解析されていると思われる方法で解析されていないことをすでに説明していますが、多くの回答=では、条件内の演算子の優先順位を参照する明らかな誤りがありますが、実際には=演算子はまったくありません。正しい説明は、if条件で変数を宣言する場合、構文は初期化子を使用した宣言の構文であるため、全体が次のように解析されるということです。

int alpha = value1 - value2 && alpha > 0.001;

解析されます。つまり、それはint alphainitialized withの宣言ですvalue1 - value2 && alpha > 0.001。そこにはオペレーター=はいません。これで、初期化式で初期化されていない変数を読み取っているとコンパイラが言う理由がわかったと思います。コンパイラは、次の宣言に対して同じ苦情を申し立てます。

int alpha = alpha; // reading uninitialized variable

まったく同じ理由で。

文字通り表現しようとしていることを達成するには、事前に宣言する必要がありますalpha

int alpha;
if ((alpha = value1 - value2) && alpha > 0.001) {
  // whatever 
}

ifまたはあなたを2つに分割する

if (int alpha = value1 - value2) 
  if (alpha > 0.001) {
    // whatever 
  }

ただし、2 番目の条件はalphaよりも大きい必要がある0ため、最初の条件を検証することさえあまり意味がありません。そのため、最も意味のあることは、全体を

int alpha = value1 - value2;
if (alpha > 0.001) {
  // whatever 
}

もちろん、他の人が既に述べたように、int値をと比較すること0.001は有効ですが、かなり奇妙なことです。やるだけ

int alpha = value1 - value2;
if (alpha > 0) {
  // whatever 
}
于 2010-01-20T17:44:11.540 に答える
4

左側は常に最初に評価されます。ここでの問題は、演算子の優先順位です。これがうまくいかないかどうかを確認してください:

if ((int alpha = value1-value2) && (alpha > 0.001))
于 2010-01-20T16:22:22.013 に答える
2

(教育目的で)仕組みを明確にした後は、これを行わないでください。同じステートメントで変数の初期化/代入と比較を混在させないでください。

各ステートメントが単独で「コマンド」または「クエリ」のいずれかである方がよいでしょう。

そして、「if」内の条件が非常に明確に読みやすく、明確にブール値である場合は、はるかに優れています。整数ではなく、何もない、ただのブール値です。

条件の最初の部分は整数です。次に、bool で and を実行します。まったく必要のない変換を強制しています。if 演算子と条件演算子が求めるものを正確に与える: ブール値。

于 2010-01-20T16:27:25.973 に答える
2

タイトルの質問に答えると、オペランドの種類によって異なります

組み込み型、&&短絡の場合、LHS が評価されることを意味し、false の場合、RHS はまったく評価されません。

をオーバーロードしたユーザー定義型の場合operator&&、短絡しません。両側が順不同で評価され、関数が呼び出されます。

ただし、他の人があなたが答える必要のある質問を処理していると思います。

于 2010-01-20T16:33:22.187 に答える
1

左から右に評価されます。

あなたの場合、ただし、割り当ては最後に発生するものであり、それら全体が次のように動作します(計算の一部としてアルファが使用され、結果を取得して初期化します):

if (int alpha = (value1-value2 && alpha > 0.001))

変数宣言を複雑な式に混在させることはできないため、次のものはコンパイルされません。

if ((int alpha = value1-value2) && (alpha > 0.001))

したがって、2 行に分割する必要があります。

int alpha = value1 - value2;
if (alpha > 0.001)
于 2010-01-20T16:28:44.913 に答える
1

私が間違っていなければ、その操作は未定義です。変数に代入してから、単一のステートメントで同じ変数を参照することは未定義です。

于 2010-01-20T16:24:24.250 に答える
1

私は通常、コードの意図をもう少し明確にするために、常に括弧を使用します。

于 2010-01-20T16:25:35.543 に答える
1
于 2010-01-20T16:44:10.697 に答える
0

私の推測では、「if」ステートメント内でストレージを宣言しているためです。それがコンパイルされるとは思いもしませんでした。

これを試して。

int alpha;
if ((alpha=value1-value2) && alpha>0.001)

しかし、これはあなたが必要とすることをしているとは思いません。アルファを int として持っていて、それを浮動小数点値と比較しています。&& ステートメントの最初の部分は、アルファがゼロでない限り true を返し、アルファが 0 より大きい場合、2 番目の部分は true を返します。したがって、おそらくこれを行う必要があります。

int alpha;
if ((alpha=value1-value2)>0)

またははるかに読みやすいコードの場合

int alpha=value1-value2
if (alpha>0)

しかし、元の質問に答えるには: && は左から右に実行され、答えが明らかな場合は短絡されます。つまり、&& の最初の部分が false の場合、2 番目の部分は評価されません!

于 2010-01-20T16:27:48.020 に答える
0

によると: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

- LtR
> LtR
&& LtR
= RtL

あなたの例を考えると

(int alpha = value1-value2 && alpha > 0.001)
(int alpha = (value1-value2) && alpha > 0.001)
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = ((value1-value2) && (alpha > 0.001)))
于 2010-01-20T16:32:25.390 に答える
0

書かれているように、この式は次のことを行います。

  1. ゼロとの暗黙的な比較により、それを評価value1 - value2して a に変換しboolます。つまり、実質的に(value1 - value2) != 0
  2. alpha > 0.001に切り捨て0.001てから評価しint(0)ます。 この時点alphaでは初期化されていません。
  3. 前の 2 つの評価の論理 ANDを計算します
  4. 論理積のブール結果を整数に変換します。

これが残りの投稿を要約していると思います。alpha別の回答を投稿した唯一の理由は、初期化されていない場合とここで発生しているすべての変換の両方について言及している回答が見つからなかったためです。wallyk の答えが最も近いです。

もちろん、括弧と別の宣言を使用することを提案する残りの回答は、alphaまさにこれを修正するために行うべきことです。ステートメント内で変数を宣言するifことは、私が適切な用途を見つけられなかった言語の一部です。繰り返し構造内での宣言の方が適切なようです。

于 2010-01-20T17:41:35.883 に答える
0

これは、演算子の優先順位と結合性をリストした記事です。

私が知る限り、あなたの意図は、一時的なものを宣言し、value1-value2 の値を割り当ててから、結果をテストし、ある値より大きい場合は if ブロックを入力することです。 alphaは int として宣言されていますが、double と比較しているようです。alpha は double でなければなりません。

あなたは一時的なものを使って創造的です。クリアはしばしばかわいいよりも優れています. 代わりにこれを行います:

double alpha = value1-value2;
if (alpha > 0.001)
于 2010-01-20T16:31:55.513 に答える
-1

問題は、ステートメントが次のように評価されていることです。

if (int alpha = (value1-value2 && alpha > 0.001))

&& 演算子の左側と右側を修正するには、括弧を使用します。

if ((int alpha = value1-value2) && (alpha > 0.001))

于 2010-01-20T16:25:30.790 に答える