1

下面的语句到底在做什么?

这让我很困惑。我很惊讶 C 允许您在if语句中使用条件运算符。有没有更好的办法?

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

如何将下面的语句重写为更简单的形式?

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

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

4

3 回答 3

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) )) ) {
于 2012-07-23T01:52:24.650 回答
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 Checking Bounds of Integers 以获得正确性证明。)

于 2012-07-23T02:00:44.417 回答
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.
}

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

于 2012-07-23T01:54:51.527 回答