混淆'if'语句

时间:2012-07-23 01:48:18

标签: c if-statement

无论如何,下面的声明是什么?

这对我来说很困惑。我很惊讶C允许您在if语句中使用条件运算符。还有更好的方法吗?

我发现if语句中的条件运算符太混乱了。我可以尝试使用&&和||经营者,但我担心我可能会犯错。

如何将以下陈述改写为更简单的形式?

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

我在BitHoist开源软件包中找到了这行C代码。

3 个答案:

答案 0 :(得分: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) )) ) {

答案 1 :(得分: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检查整数界限是否正确。)

答案 2 :(得分: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.
}

但显然它在实施方面要大得多。