[英]Compare a value to two other values in a single expression while referring to the first value only once
假設你有一個返回數字的函數foo()
。
您想檢查返回值是否等於N
或M
你可以做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 ^ M
, M'
持有M ^ foo()
。 所以N' ^ M'
給出N ^ foo()
。 從左到右計算逗號運算符,表達式的值等於其手側。
if (N ^= M, M ^= foo(), !(M * (N ^ M))) {
// your code here
}
假設N > M
, N - M
是2的冪,並且這里的無符號整數是32位。
應該存在2的另一個冪K
,使得k * (N - M)
環繞為0。
如果N - M
是2 i ,那么K
將是2 32-i 。
然后表達式!(K * (foo() - M))
將給出答案。
但這取決於許多條件; 我正在為所有可能的N
和M
尋找解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.