如何在 C 语言中简化逻辑运算

How to simplify logical operation in C

提问人:Sedmaister 提问时间:8/20/2019 最后编辑:Nipun TharukshaSedmaister 更新时间:8/21/2019 访问量:252

问:

我有以下逻辑,需要简化才能看起来更清晰和简洁:

 if (x1 < y1)
    return 1;
 else if (x1 == y1)) {
     if (x2 < y2)
         return 1;
     else if (x2 == y2) {
         if (x3 < y3)
             return 1;
     } else 
         return 0;
     }
 } else
    return 0;

为了解决上述问题,我应用了逻辑表达式来进一步简化这几行条件:

if (x1 < y1 || (x1 == y1 && x2 < y2) || (x1 == y1 && x2 == y2 && x3 < y3))
    return 1;
else
    return 0;

我不确定如何从这里进一步简化。谁能帮我?

更新:为了进一步简化,我尝试将布尔代数应用于此表达式,但没有运气!我想出了这个:

A + (A1 * B) + (A1 * B1 * C)

其中表示 to 和 表示Ax1 < y1A1x1 == y2

条件语句 逻辑运算符 代数

评论

0赞 John Meacham 8/20/2019
你是想简化它以使其更清晰、更简洁,还是处于一个需要大量优化的紧密循环中?如果是第二个,并且您的值范围有限,则可以通过一些移位和单个比较来完成。但必须有非常具体的理由才能使它成为正确的方法。
0赞 8/20/2019
我认为问题就在这里:codereview.stackexchange.com
0赞 Scott Hunter 8/20/2019
x1 < y1 || (x1 == y1 && (x2 < y2 || (x2 == y2 && x3 < y3)))
1赞 Sedmaister 8/20/2019
我试图简化它,使其更清晰、更简洁。在这种情况下,性能并不重要,可读性才是。如果位移使它看起来可读 - 那就这样吧。

答:

0赞 Chris Dodd 8/20/2019 #1

IMO 在 C 语言中执行这种链式关系的最简洁方法是:?:

return x1 == y1 ? x2 == y2 ? x3 < y3 : x2 < y2 : x1 < y1;

正如问题注释中所指出的,如果您真的关心性能,并且值的范围有限,则可以使用位旋转将它们组合成一个值进行比较。例如,如果字段都是uint16_t(无符号 16 位值),则可以执行以下操作:

uint64_t x = ((uint64_t)x1 << 32) + ((uint64_t)x2 << 16) + x3;
uint64_t y = ((uint64_t)y1 << 32) + ((uint64_t)y2 << 16) + y3;
return x < y;

但这可能不太清楚,可能为时过早的优化。

评论

0赞 8/20/2019
我相信这更具可读性:因为 和 很接近,x2、y2 也是如此。它还会立即处理短分支。return x1 != y1 ? x1 < y1 : (x2 != y2 ? x2 < y2 : x3 < y3);x1 != y1x1 < y1
0赞 Chris Dodd 8/21/2019
@dyukha:合理,但您可能应该删除多余的括号,使其不太清楚。