C 除掉;如果布尔逻辑
我想知道我们是否可以只用布尔逻辑来摆脱所有的“if”语句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'
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);