簡體   English   中英

C:具有多個運算符的條件表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM