多个if()语句如何合并为一个?

4

This:

if (A || B) { X; }
if (C && D) { X; }
if (F != G && H + I === J) { X; }

可以被替换为:

if ((A || B) || (C && D) || (F != G && H + I === J)) { X; }

但它能被替换吗:

if (A || B || C && D || F != G && H + I === J) { X; }

?(不带括号)

不同的语言之间有什么区别吗?

附注:答案不应基于这些示例。


1
FYI,第一个代码示例与第二个不等价。第二个只能运行一次“X”,但第一个可以运行三次。 - Blender
@Blender 谢谢。如果Xfoo=3;,那么它就是等价的。 - Alexandre Khoury
@djechlin 已经给出了答案。但最终会降低可读性。就像你说的,如果 x 是 foo=3,从可读性来讲,你的第二种语句是最好的。 - hari
4个回答

6

首先,如果这些具有副作用,则所有操作都无效。

其次,仅当X是幂等的时才有效。这是一种说法,意思是可以在第二次调用X时不做任何更改。

http://en.cppreference.com/w/cpp/language/operator_precedence

&& 的优先级高于 || ,所以在此情况下可以省略对 && 使用括号。我相信运算符优先级规则适用于任何具有此类规则的语言,我不知道任何反例,并且您询问的语言确实遵循C运算符优先级规则。


那么,if(A){X;}if(B){X;} 可以总是被 if(A||B){X;} 替代?无论A和B是什么? - Alexandre Khoury
如果A是returnTrue(),B是blowUptheWorldThenReturnTrue(),那么在前一种情况下可能会产生意外的结果。如果X是i++,则不行,因为在前一种情况下i被加了两次。查找短路。 - djechlin

1

@Mageek 如果有人在商业代码中看到这个,他们会吓得要死。但我猜这很有趣。 - Fantastic Mr Fox

1

你的第一个等价语句在C++中至少是不正确的。

if(A||B){X;}
if(C&&D){X;}
if(F!=G&&H+I==J){X;}

如果有多个条件为真,则可以执行X多次。此外,以上保证至少评估ACFG。同时这个

if((A||B) || (C&&D) || (F!=G&&H+I===J)){X;}

保证只执行一次X,并且至少保证评估A


0

是的,它并没有显示出太大的区别,因为&& 的优先级比 || 更高


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接