[英]C: conditional expressions with multiple operators
在 C 中,這樣的事情合法嗎?
if (0<=x<=y<=y+1) then ...
還是我必須用 &&'s 和 ||'s 和括號分隔它?
這是合法的,但可能不符合您的預期。 它被視為您寫過:
if (((0 <= x) <= y) <= y+1)
(0 <= x)
的計算結果為 0 或 1; 將 0 或 1 與y
進行比較,產生另一個 0 或 1 結果; 這與y+1
進行比較,產生用於控制if
語句的最終 0 或 1。
如果您的目標是確保x
不小於零或大於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。
這是完全合法的,但實際上沒有用。 您應該使用&&
和/或||
構建正確的表達式 .
這是對符號的濫用——即使在數學環境中,也不是嚴格合法的,即使在那里。 <= 仍然是二元運算符的唯一方法是(1)將運算符的類型從 (ordinal,ordinal) → boolean 提升到 (boolean,ordinal), (boolean,ordinal) → (boolean,ordinal), (B,Z) <= (B',Z') 重新解釋為 (B && B' && Z <= Z', Z'), (2) 有一個隱式轉換 Z → ( true, Z) 和 (3) 進行另一個隱式轉換為布爾 (B, Z) → B。
你可能會在 C++ 中通過它的元組類型、構造函數和運算符重載來實現類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.