2014-01-14 72 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結尾。