C 除掉;如果布尔逻辑

C 除掉;如果布尔逻辑,c,boolean,logic,C,Boolean,Logic,我想知道我们是否可以只用布尔逻辑来摆脱所有的“if”语句 int main() { int a,b,c,d; char e; scanf("%d %d %d", &a, &b, &c); scanf("%d", &d); if (d == 0) { e = 'O'*((a+b == c) || (a+c == b) || (b+c == a)); e += (e == 0)*'X'

我想知道我们是否可以只用布尔逻辑来摆脱所有的“if”语句

int main() {
    int a,b,c,d;
    char e;

    scanf("%d %d %d", &a, &b, &c);
    scanf("%d", &d);

    if (d == 0)
    {
        e = 'O'*((a+b == c) || (a+c == b) || (b+c == a));
        e += (e == 0)*'X';

        printf("%c\n",e);
    }

    if (d == 1)
    {
        e = 'O'*((a*b == c) || (a*c == b) || (b*c == a));
        e += (e == 0)*'X';

        printf("%c\n",e);
    }
}
到目前为止,我已经能够替换

if ((a+b == c) || (a+c == b) || (b+c == a))
{
e = '0';
}

else
{
e = 'X';
}

有什么办法可以摆脱这些台词吗

if (d == 0)


使用相同的逻辑?

如您所愿,如果-语句剩余,则无

!d && (
    (e = 'O'*((a+b == c) || (a+c == b) || (b+c == a))),
    (e += (e == 0)*'X'),
    printf("%c\n",e)
);

d-1 || (
    (e = 'O'*((a*b == c) || (a*c == b) || (b*c == a))),
    (e += (e == 0)*'X'),
    printf("%c\n",e)
);
我滥用了
|
&&
和逗号运算符
的短路

不管怎样,如果你想看到模糊不清的大师,看看

.

说到其动机,如果您关心效率,这是一件好事,因为条件分支非常耗时(这就是为什么存在一些复杂的分支预测机制)。但在通常的代码中,这不是一个好的实践,因为读者可能很难理解它,所以代码很难维护。另外,由于你是初学者,这是一个很好的练习

现在,请记住,总有办法。值得一提的是,您有逻辑运算、位运算和算术运算的组合。这完全可以通过按位操作完成

让我们试着只使用位运算。假设您的代码是:

if (d == 0)
    e = A;
if (d == 1)
    e = B;
,其中A和B是为e计算的两个值

首先,将最后一个有效位扩展到d的所有位(因此,如果d为1,则应为0xFFFFFF,如果为0,则应为0x00000000)。然后,进行操作。我把它们分成多行,但可以做得更紧凑

d = d << 1 + d;
d = d << 2 + d;
d = d << 4 + d;
d = d << 8 + d;
d = d << 16 + d;
e = (B & d) || (A & ~d);

d=d什么,为什么??为什么要删除if语句?(我认为这属于:滥用if语句:D)只是为了检查这是否可能。但它也很难看,不可读。看见虽然他们至少是混淆的艺术家。你的目标是让这个代码的未来维护者自杀吗?哈哈,未来不会有任何维护者。这只是我尝试使用的一个基本代码,用来锻炼自己。我猜begginer的好奇心是大师们无法理解的^^^很有趣,谢谢。我将对此进行分析(以前从未使用过逗号运算符!)我还将检查混淆:)谢谢您的时间,这有助于我了解它的工作原理。
if (d == 0)
    e = A;
if (d == 1)
    e = B;
d = d << 1 + d;
d = d << 2 + d;
d = d << 4 + d;
d = d << 8 + d;
d = d << 16 + d;
e = (B & d) || (A & ~d);