簡體   English   中英

將值與單個表達式中的其他兩個值進行比較,同時僅引用第一個值

[英]Compare a value to two other values in a single expression while referring to the first value only once

假設你有一個返回數字的函數foo()

您想檢查返回值是否等於NM

你可以做foo() == N || foo() == M foo() == N || foo() == M 但這需要兩次調用foo()

如何在調用foo()一次時創建一個單獨的布爾C表達式?

編輯:正如標題已經說明,我想指的是第一個值只有一次。 這必須在單個C表達式中,即沒有臨時變量,這需要單獨的聲明語句。 否則答案是微不足道的。

if((x = foo()) == N || x == M) ...

嘗試

int x = foo();
if (x == N || x == M) ...

似乎相當明顯

為什么不將foo()的結果設置為中間變量?

x = foo();
if(x == N || x == M)
  ...

你需要一個臨時存儲foo的返回值,以便不調用它兩次,然后你可以用一對==和一個||直接做到這一點。 但是,如果你真的想要if更像是“原子”的東西,你可以使用這樣的臨時值來做到這一點:

  int temp;
  if (temp = foo(), !((temp ^ N) * (temp ^ M))) {
    // your code here
  }

它可能會從短路評估中保存分支,具體取決於編譯器生成的內容。

沒有臨時的:
如果您不關心修改N和M,則可以在沒有temp的語句中進行測試。 N'持有N ^ MM'持有M ^ foo() 所以N' ^ M'給出N ^ foo() 從左到右計算逗號運算符,表達式的值等於其手側。

  if (N ^= M, M ^= foo(), !(M * (N ^ M))) {
    // your code here
  }

假設N > MN - M是2的冪,並且這里的無符號整數是32位。

應該存在2的另一個冪K ,使得k * (N - M)環繞為0。

如果N - M是2 i ,那么K將是2 32-i

然后表達式!(K * (foo() - M))將給出答案。

但這取決於許多條件; 我正在為所有可能的NM尋找解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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