and && 演算子が評価される順序はどれですか
たとえば、次のコード
if (float alpha = value1-value2 && alpha > 0.001)
//do something
アルファが開始されずに使用されているという例外をスローしました。&& の左側の式は常にアルファの値を最初に開始すると思っていましたが、間違っているようです
何か案が?
ありがとう
and && 演算子が評価される順序はどれですか
たとえば、次のコード
if (float alpha = value1-value2 && alpha > 0.001)
//do something
アルファが開始されずに使用されているという例外をスローしました。&& の左側の式は常にアルファの値を最初に開始すると思っていましたが、間違っているようです
何か案が?
ありがとう
これは次のように解析されます。
if (int alpha = (value1-value2 && (alpha > 0.001)))
...&&
よりも「解析の優先順位」が高いため、=
これはおそらくあなたが望むものではありません。試す:
int alpha = value1-value2;
if (alpha && (alpha > 0.001))
ここでの結論は、あなたが表現しようとしているものは、それに埋め込まれているという宣言を伴う単一の論理条件ではおそらく表現できないということですalpha
(他のいくつかの回答が主張しているものにもかかわらず)。
他の回答では、条件が解析されていると思われる方法で解析されていないことをすでに説明していますが、多くの回答=
では、条件内の演算子の優先順位を参照する明らかな誤りがありますが、実際には=
演算子はまったくありません。正しい説明は、if
条件で変数を宣言する場合、構文は初期化子を使用した宣言の構文であるため、全体が次のように解析されるということです。
int alpha = value1 - value2 && alpha > 0.001;
解析されます。つまり、それはint alpha
initialized 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
}
左側は常に最初に評価されます。ここでの問題は、演算子の優先順位です。これがうまくいかないかどうかを確認してください:
if ((int alpha = value1-value2) && (alpha > 0.001))
(教育目的で)仕組みを明確にした後は、これを行わないでください。同じステートメントで変数の初期化/代入と比較を混在させないでください。
各ステートメントが単独で「コマンド」または「クエリ」のいずれかである方がよいでしょう。
そして、「if」内の条件が非常に明確に読みやすく、明確にブール値である場合は、はるかに優れています。整数ではなく、何もない、ただのブール値です。
条件の最初の部分は整数です。次に、bool で and を実行します。まったく必要のない変換を強制しています。if 演算子と条件演算子が求めるものを正確に与える: ブール値。
タイトルの質問に答えると、オペランドの種類によって異なります。
組み込み型、&&
短絡の場合、LHS が評価されることを意味し、false の場合、RHS はまったく評価されません。
をオーバーロードしたユーザー定義型の場合operator&&
、短絡しません。両側が順不同で評価され、関数が呼び出されます。
ただし、他の人があなたが答える必要のある質問を処理していると思います。
左から右に評価されます。
あなたの場合、ただし、割り当ては最後に発生するものであり、それら全体が次のように動作します(計算の一部としてアルファが使用され、結果を取得して初期化します):
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)
私が間違っていなければ、その操作は未定義です。変数に代入してから、単一のステートメントで同じ変数を参照することは未定義です。
私は通常、コードの意図をもう少し明確にするために、常に括弧を使用します。
私の推測では、「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 番目の部分は評価されません!
によると: 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)))
書かれているように、この式は次のことを行います。
value1 - value2
して a に変換しbool
ます。つまり、実質的に(value1 - value2) != 0
alpha > 0.001
に切り捨て0.001
てから評価しint(0)
ます。 この時点alpha
では初期化されていません。これが残りの投稿を要約していると思います。alpha
別の回答を投稿した唯一の理由は、初期化されていない場合とここで発生しているすべての変換の両方について言及している回答が見つからなかったためです。wallyk の答えが最も近いです。
もちろん、括弧と別の宣言を使用することを提案する残りの回答は、alpha
まさにこれを修正するために行うべきことです。ステートメント内で変数を宣言するif
ことは、私が適切な用途を見つけられなかった言語の一部です。繰り返し構造内での宣言の方が適切なようです。
これは、演算子の優先順位と結合性をリストした記事です。
私が知る限り、あなたの意図は、一時的なものを宣言し、value1-value2 の値を割り当ててから、結果をテストし、ある値より大きい場合は if ブロックを入力することです。 alpha
は int として宣言されていますが、double と比較しているようです。alpha は double でなければなりません。
あなたは一時的なものを使って創造的です。クリアはしばしばかわいいよりも優れています. 代わりにこれを行います:
double alpha = value1-value2;
if (alpha > 0.001)
問題は、ステートメントが次のように評価されていることです。
if (int alpha = (value1-value2 && alpha > 0.001))
&& 演算子の左側と右側を修正するには、括弧を使用します。
if ((int alpha = value1-value2) && (alpha > 0.001))