2012-07-23 78 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