2012-07-23 82 views
1

無論如何下面的陳述是什麼?混淆'if'陳述

這讓我感到困惑。我很驚訝C允許您在if語句中使用條件運算符。有沒有更好的辦法?

我發現if語句中的條件運算符太混亂。我可以嘗試使用& &和||操作員,但恐怕我可能犯了一個錯誤。

如何將下面的語句重寫爲更簡單的形式?

if ((offset < 0) ? 
     (input->binData.bounds.lo >= (unsigned long)(-offset)) : 
     (input->binData.bounds.hi < (unsigned long)(-offset))) 

我在BitHoist開源軟件包中發現了這行C代碼。

+0

我完全贊成你,這個代碼是不必要的鈍角。儘管聽起來你已經有了答案。我不知道C是否真的有助於清理這個問題,但我覺得應該將整個條件解壓到它自己的函數中,並且「父」條件應該檢查​​該函數的輸出。 – David 2012-07-23 01:53:16

回答

5

可以AND三元條件(offset < 0)和它的對立面(offset >= 0)與三元運營商的各項決議:

if (((offset < 0) && (input->binData.bounds.lo >= (unsigned long)(-offset))) || 
    ((offset >= 0) && (input->binData.bounds.hi < (unsigned long)(-offset)))) { 
+2

您可能還想爲(無符號長整數)( - offset)和input-> binData.bounds進行臨時操作以減少重複。 – Antimony 2012-07-23 01:53:31

+0

這看起來最接近原始代碼。所以它更安全。 (無符號長)( - 偏移量)是奇數。我不太瞭解代碼以做出重大改變。 – historystamp 2012-07-23 03:00:46

2

這裏是想想不太混淆的方式:

overallBool = 0; 

if ((offset < 0) { 
     overallBool = input->binData.bounds.lo >= (unsigned long)(-offset); 
} else { 
     overallBool = input->binData.bounds.hi < (unsigned long)(-offset); 
} 

if (overallBool) { 
    do your thing. 
} 

但是,顯然它在實施中要大得多。

3

假設input->binData.bounds.lo <= 0 <= input->binData.bounds.hi和兩者都是long,您可以利用無符號算術和比較來減少到單個條件。

if ((unsigned long)(-offset) - input->binData.bounds.lo < 
    input->binData.bounds.hi - input->binData.bounds.lo) { ... } 

(見Hacker's Delight 4-1檢查整數界正確性的證明。)

+0

我見過bounds.lo>零。 – historystamp 2012-07-23 03:03:44