2014-01-14 38 views
0

我是编程新手,请不要评价我。这个问题是简单的概念知识,我不知何故错过了。我的问题是,当您使用ANDOR运算符时,括号是否有所不同?例如,php AND,OR语句中的运算符

if (x == 1 && (y == 1 || y == 2)){ 
    // do something 
} 

基本上,我想要做的是,x具有在任何时候都采取值1,可以y 1和2之间变化是否用于此目的上面的代码有意义吗?而且它是从不同:

if (x == 1 && y == 1 || y == 2){ 
    // do something 
} 
+2

就像在算术中一样,'AND'就像'*','OR'就像'+'一样。 – moonwave99

+2

总是把你的条件放在使用括号的“块”中是个好习惯,所以不用'if(x == 1 &&(y == 1 || y == 2))'if((x == 1)&&((y == 1)||(y == 2)))'。当您开始使用支持宏的语言或使用预处理器 –

回答

3

是的,他们这样做。你真正要问的是&&||的运算符优先级是多少?

&&||具有更高的优先级,这意味着如果未使用方括号明确指定顺序(如您在第一个示例中那样),将首先评估它。

您可以将优先顺序看作PHP向表达式添加括号的顺序(如果尚未放入)。在第二个示例中,优先级最高的运算符为==,因此所有这些实例都是用方括号括:

(x == 1) && (y == 1) || (y == 2) 

下一个最高的是&&,所以现在我们加上括号围绕这些:

((x == 1) && (y == 1)) || (y == 2) 

表达现在是明确的,所以我们不需要再添加任何括号。

希望从这个论点中可以清楚的看到,你的文章中的第一个表达式是而不是与第二个表达式相同。例如,如果x==0y==2,第一个表达式(正确)评估为false,而第二个表达式评估为true。

请参阅here了解PHP中的运算符优先级列表。

+0

+1需要时间来创建一个描述良好的答案 – pewpewlasers

3

是, 第一个代码,x == 1‍将首先检查,结果将会对结果y == 1 || y == 2进行检查。 和在第二个,x == 1 && y == 1将首先进行检查和它的结果将打击|| y == 2

+0

时,您可以获得回报,因此您可以在第二个“||” y == 2'没有用处? – pewpewlasers

+0

否,在第二个中,将检查'x == 1 && y == 1'的结果,并且结果将被检查为“||”。 y == 2' –

+0

在第一个代码我想如果x!= 1它甚至不会进入括号,所以你的回答是不正确的。 – webduvet

1

&&具有更高的比precedence||进行检查,所以它会被第一评价。括号的使用可以帮助您确保执行的顺序与您期望的相同。

从PHP手册:

使用括号的,即使不是绝对必要的,通常可以通过使分组明确,而不是依赖于隐运算符优先级和结合性提高代码的可读性。

+0

+1“括号” – danronmoon

1

的& &(逻辑与)运算符表示两个操作数是否真实。 || (逻辑OR)运算符指示至少一个操作数为真。而且......操作数是多少?

当你使用一个简单的表达式,如x == 1,这被认为是一个操作数。

如果使用括号,则括号内的所有内容都将被视为一个操作数,无论其内部有多复杂。所以你可以组条件。

因此x == 1 && (y == 1 || y == 2)将评估第一个操作数x == 1是否为真,第二个操作数是整个(y == 1 || y == 2)为真。

要知道括号内的内容是真是假,无论它里面有什么都被评估为独立表达式。

所以,我们必须要操作数。首先,它会检查x == 1是否为真。如果它是假的,它不会检查括号内是什么,它不重要,因为无论如何第一个条件不满足。如果x == 1,我们可以检查第二个操作数: ,以便检查括号内的表达式,即y == 1 || y == 2,如果有一些是真的,那么(y == 1 || y == 2)是真操作数,整个表达式将是x == 1 && true,所以基本上它取决于x,如果括号内没有为真,那么(y == 1 || y == 2)是一个假操作数,并且整个操作会x == 1 && false所以一切都是假的

如果你不使用支架,就可以达到同样的效果,但你必须检查precedence rules,那将是很难记住,在开始时

我建议您在学习编程语言之前,阅读一些关于布尔型algebralogic的教程。此后一切都会变得更加轻松。

0

在第一个例子中 首先评估左侧。如果这是真的,它会看到右侧是支架,因此它会进入支架并对其进行评估,而不是对左侧进行检查。

第二个例子不会像你想要的那样工作,因为如果x!= 1,它仍然会去右侧寻找y == 1,并且你可以以true结尾。