0

Cでは、このようなものは合法ですか?

if (0<=x<=y<=y+1) then ...

それとも && と || と括弧で区切る必要がありますか?

4

4 に答える 4

7

それは合法ですが、おそらくあなたが期待することをしません。それはあなたが書いたかのように扱われます:

if (((0 <= x) <= y) <= y+1)

(0 <= x)0 または 1 に評価されます。0 または 1 が と比較されy、別の 0 または 1 の結果が得られます。これは と比較され、ステートメントy+1を制御するために使用される最終的な 0 または 1 が得られます。if

xが 0 未満または よりも大きくないことy、およびが よりも大きくないことを保証することを目指している場合は、次のように記述します。yy+1

if (0 <= x && x <= y && y <= y+1)

y <= y+1私はそれが通常正しいことに注意します。yが符号なしの型で、その型の最大値に等しい場合y+1は 0です。 が符号付きの型でその型の最大値にy等しい場合は、それに 1 を追加して未定義の動作を呼び出します。運y+1が良ければ、署名された型の負の最大値にラップしますが、それを当てにすることはできません (そのため、バグが必ずしも前に現れるとは限らないため、「運が悪い場合」になる可能性があります)。大きな問題を引き起こします)。

于 2012-09-22T18:52:35.203 に答える
3

それは合法です(そして定義されています; Google検索用語「演算子の優先順位」)が、あなたが期待したり意味​​したりすることはないと思います。

于 2012-09-22T18:52:56.847 に答える
1

いいえ、それは合法的な C コードですが、あなたが望むことを行うことはまったく不可能です。&& または || を使用する必要があります。その理由は、たとえば、y がブール値以上であるかどうかを実際に確認しているためです。C および C++ では、通常は 0 と 1 です。

于 2012-09-22T18:52:17.300 に答える
1

これは完全に合法ですが、実際には役に立ちません。&&and/orを使用して適切な式を作成する必要があります||

于 2012-09-22T18:53:36.807 に答える