Cでは、このようなものは合法ですか?
if (0<=x<=y<=y+1) then ...
それとも && と || と括弧で区切る必要がありますか?
それは合法ですが、おそらくあなたが期待することをしません。それはあなたが書いたかのように扱われます:
if (((0 <= x) <= y) <= y+1)
は(0 <= x)
0 または 1 に評価されます。0 または 1 が と比較されy
、別の 0 または 1 の結果が得られます。これは と比較され、ステートメントy+1
を制御するために使用される最終的な 0 または 1 が得られます。if
x
が 0 未満または よりも大きくないことy
、およびが よりも大きくないことを保証することを目指している場合は、次のように記述します。y
y+1
if (0 <= x && x <= y && y <= y+1)
y <= y+1
私はそれが通常正しいことに注意します。y
が符号なしの型で、その型の最大値に等しい場合y+1
は 0です。 が符号付きの型でその型の最大値にy
等しい場合は、それに 1 を追加して未定義の動作を呼び出します。運y+1
が良ければ、署名された型の負の最大値にラップしますが、それを当てにすることはできません (そのため、バグが必ずしも前に現れるとは限らないため、「運が悪い場合」になる可能性があります)。大きな問題を引き起こします)。
それは合法です(そして定義されています; Google検索用語「演算子の優先順位」)が、あなたが期待したり意味したりすることはないと思います。
いいえ、それは合法的な C コードですが、あなたが望むことを行うことはまったく不可能です。&& または || を使用する必要があります。その理由は、たとえば、y がブール値以上であるかどうかを実際に確認しているためです。C および C++ では、通常は 0 と 1 です。
これは完全に合法ですが、実際には役に立ちません。&&
and/orを使用して適切な式を作成する必要があります||
。