2009-01-19 119 views
0

對不起,如果這是一個comp-sci 101問題。我只是不確定我是否缺少明顯的東西。邏輯運算符:是和優於或?

讓我們說一些用戶輸入引發錯誤,我想趕上並返回一些反饋。錯誤將是一個數字,0 - 8。0表示「沒有錯誤」。如果錯誤是3(我們假設沒有數字),我想給用戶非常具體的反饋。對於其他7種可能性,我只想結束腳本並回應錯誤。

我工作了這一點,決定去與這樣的:反正

$no_errors ($_error != 0 || $_error != 3) ? FALSE : TRUE; 
if (!$no_errors) 
echo $error_msg['$_error']; 
$error_3 ($no_errors && $_error == 3) ? TRUE : FALSE; 
if ($error_3) 
    bunch of stuff happens; 
else 
    bunch of other stuff; 

,當時我注意到OR運算符的第一行,並認爲這可能會更好/更安全的用戶一個與運營商。但是我越是思考,我越看到差異。

所以真正的問題是,如果你想消除特定變量的兩種可能性,AND和OR是否相同,或者是邏輯上或功能上更優化的?

+0

不要詢問有關開發的基本面道歉,甚至在節目20yrs我經常寫微基準測試和測試應用程序,以證明根本的東西。證明你的假設是掌握你的交易的一個重要方面。 – TravisO 2009-01-19 18:50:23

+0

三元編程導致可讀性差,我總是避免它。 – TravisO 2009-01-19 18:50:57

回答

1

邏輯下面是相同的(請原諒我的僞代碼)

(! expression_one || ! expression_two) /** this is the same as the one below **/ 
! (expression_one && expression_two) 

功能上哪一個更優化?它們都是彼此最優的。這兩種方法(& &和||)允許短路如果第一個表達式爲真(在||情況下)或假(在& &情況下)

2

從表現上看,請記住,評估在大多數語言中都是懶惰的。使用OR,如果第一個條件爲真,它將返回true而不評估第二個條件。對於AND,如果第一個條件是假的,它將返回false,而不評估第二個條件。

否則,運營商本身的表現並沒有真正的不同。使用你最可讀的內容。

0

(A || B)=!(A & & B)。所以它真的沒有區別

編輯:(A || B)=!(A & & B)是錯誤的。 Tks的評論。正確的格式是(!A ||!B)=!(A & & B)。

我道歉

+0

嘿,事實並非如此。德·摩根定律:==(A && B) – 2009-01-19 11:38:02

1

最好是一個可以幫助你閱讀代碼快。這是您可以在這裏做出的唯一真正的優化,並且可能在數百萬其他地方。

1

這看起來更簡單閱讀:

if($_error==3) 
     do stuff; 
    else if($_error>0) 
     do some other stuff 
    else 
     do normal stuff 

沒有人注意到你可能贏得微秒。

4

首先,我想我會推薦使用另一種識別錯誤的方式,而不是使用「幻數」。他們很難維持,因爲你很容易忘記「3」的含義。它看起來像你的語言是PHP,它支持異常。我建議使用它們來代替,你可以在這裏閱讀更多關於它們的信息:http://dk.php.net/exceptions

至於邏輯運算符,並沒有真正被認爲是「良好實踐」的東西。使用你想要的。如果你有麻煩搞清楚時,你的表情是真/假,請嘗試真值表:http://en.wikipedia.org/wiki/Truth_table

20

,如果你使用switch語句這將是更可讀:

switch ($_error) { 
    case 0; 
     nothing happens; 
     break; 
    case 3: 
     bunch of stuff happens; 
     break; 
    default: 
     bunch of other stuff; 
     break; 
} 
0

在性能方面,我相信他們都非常相似(見職位由wvanbergen),但是在行爲上存在明顯的差異。我認爲你目前的發帖可能沒有做你想做的事。在第一行,如果你$ _error = 3,那麼你將有$ no_errors = false。當你檢查兩個條件都需要滿足時,也許會更合適。

有時候我發現要檢查我的邏輯是居然說我想要什麼響亮的最簡單方法。例如,「我們沒有任何錯誤,如果錯誤代碼是不和 3」

我通常發現,在這樣的情況下,只有少數變量,我會寫句子的方式用英語爲我提供了確定邏輯運算符最直觀(和準確)的方法。

如果您發現該代碼看起來雜亂無章後這個過程,然後如果你用你可能會發現有用的

0

德摩根定律this鏈接:

$no_errors ($_error != 0 && $_error != 3) ? FALSE : TRUE; 

這意味着,如果$錯誤= 0 AND $ error!= 3這是無效邏輯,因爲$ error不能是== 3和0,它可以是3或0但不是兩者。
在上面的例子中,如果$錯誤= 0那麼將評估爲FALSE,因爲它不是3 & & 0你正在尋找它是要麼3 || 0.

1
  1. 就我個人而言,我會消除這些數字的使用和使用常量。除了易於維護之外,它們還使編碼本身變得更加容易,並允許您明天更新值,例如如果某些情況下foreces您從3更改號碼,你必須非常通過所有的代碼
  2. 看起來正如gkrogers建議,開關 而完成同樣的事情 更容易閱讀和維護