无论如何,下面的声明是什么?
这对我来说很困惑。我很惊讶C允许您在if
语句中使用条件运算符。还有更好的方法吗?
我发现if
语句中的条件运算符太混乱了。我可以尝试使用&&和||经营者,但我担心我可能会犯错。
如何将以下陈述改写为更简单的形式?
if ( (offset < 0) ?
( input->binData.bounds.lo >= (unsigned long)(-offset) ) :
( input->binData.bounds.hi < (unsigned long)(-offset) ) )
我在BitHoist开源软件包中找到了这行C代码。
答案 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.
}
但显然它在实施方面要大得多。