2013-12-13 64 views
5

你好,親愛的程序員,Java運算符的邏輯&&和||

我有一個字符串String input = "30.09.1993"; 然後我想保存的所有號碼在此字符串數組(僅數字!)。 「。」在索引2和5,所以我想跳過我的字符串的這些部分在我的循環與if語句。

我解決了我的問題,一切正常,但我與&&||運營商的邏輯混淆。

這是我的工作代碼:

String input = "30.09.1993"; 
int[] eachNumbers = new int[8]; 

int x = 0; 
for(int i = 0; i <= 9; i++){ 
    if(i != 2 && i != 5){ 
     eachNumbers[x] = Integer.parseInt(input.substring(i, i+1)); 
     x++; 
    } 
} 

這是不工作的代碼:

String input = "30.09.1993"; 
int[] eachNumbers = new int[8]; 

int x = 0; 
for(int i = 0; i <= 9; i++){ 
    if(i != 2 || i != 5){ 
     eachNumbers[x] = Integer.parseInt(input.substring(i, i+1)); 
     x++; 
    } 
} 

這兩段代碼之間的唯一區別是,如果子句中的運營商。

我認爲,這些運營商的結果是:

&&操作:

false + false = false 
true + false = false 
false + true = false 
true + true = true 

||操作:

false + false = false 
true + false = true 
false + true = true 
true + true = true 

所以,在我看來,第二代碼片段應該工作,第一個應該拋出一個NumberFormatException。但事實並非如此。

我確信有一些更好的解決方案,我即將做的事情,但我的問題只是關於我的if語句的邏輯。有人能向我解釋這背後的邏輯嗎?我完全困惑,並感謝每一個有幫助的答案。

問候 盧卡斯Warsitz

回答

7

在第二片段中,if-子句總是爲真,因爲i將始終不2或不是5(因爲它不能是2和5在同一時間)

因爲你想要做的事情你的第一個片段是好的,它確實是你想要的:如果你不在第三個元素,而不是在第六個元素,你想解析,否則你在一個點在日期。

+0

想了一會兒你的答案我明白了,非常感謝你的快速答案! –

3

關鍵點是在這裏:在& &如果第一種情況是假的,第二種情況不會檢查。

true && false // Evaluates false because the second is false 
false && true // Evaluates false because the first is false 
true && true // Evaluates true because both are true 
false && false // Evaluates false because the first is false 

在||如果第一種情況屬實,則第二種情況不會檢查。

true || false // Evaluates true because the first is true 
false || true // Evaluates true because the second is true 
true || true // Evaluates true because the first is true 
false || false // Evaluates false because both are false 
+0

「false && false //評估錯誤,因爲兩者都是錯誤的」 - 不正確。因爲第一個是假的,所以第二個是未經測試的 –

+0

哦...是的!現在看到編輯。 –

1

你的第二個片段是不工作,因爲它應該是

if(i != 2 && i != 5) 

,你的第一個片段是不扔,因爲你已經使用& &有同樣的原因錯誤。

+0

你告訴我之前我所知道的一切......但無論如何感謝 –

3

雖然不一定是LionC注意到的問題。

4個和或邏輯運算符遵循以下邏輯:

&是你描述& &上方。

false + false = false 
true + false = false 
false + true = false 
true + true = true 

|是你描述||上述

false + false = false 
true + false = true 
false + true = true 
true + true = true 

& &和||是快捷操作符,如果它不會影響結果,則不會測試第二個值。

& &

false + untested = false 
true + false = false 
false + untested = false 
true + true = true 

||

false + false = false 
true + untested = true 
false + true = true 
true + untested = true 
1

選擇一個號碼,任何數目。它不等於2或不等於5.

因此表達式(i != 2 || i != 5)可以靜態地(通過編譯器)轉換成只有true並且整個控制結構被刪除。

顯而易見的結果是NumberFormatException如果任何的字符不是數字。

1

我沒有給你的問題的答案,而是建議更好的代碼。

public class splitToArray { 
    public static void main(String[] args) { 
     String input = "30.09.1993";  
     input = input.replace(".", " "); 
     String array[] = input.split(" "); 
     for(String value : array){ 
      System.out.println(value); 
     } 
    } 
} 

Output: 
30 
09 
1993 

現在使用Integer.parseInt來獲得整數值。當你有String input = "30.9.1993"; [0從09中刪除]

+0

感謝您的建議,但我需要從出生日期創建一個數字總和,這就是爲什麼我需要每一個數字。 –

1

i一次只能有一個值。
因此,任何下列條件爲有效:

if(i != 2 && i != 5) //means `i` is not any 2 AND i is not 5 

if(i == 2 || i == 5) //means `i` is either 2 OR 5 

注:(i != 2 || i != 5)永遠是正確的,因爲在任何時候

  1. 如果我= 2,LHS i is not equal to 2爲FALSE且RHS i is not equal to 5爲真
  2. 如果i = 5,則LHS i is not equal to 2爲TRUE,而RHS i is not equal to 5爲FALSE
  3. 對於i的所有其他值:LHS和RHS均爲真。
+0

「|」不代表OR :) –

+0

@rookieB它代表OR,但[按位或](http://stackoverflow.com/a/10142098/2982225),不適用於邏輯或;)感謝注意:) –

+1

我沒有看到你正在使用按位或,因爲我認爲這是一個錯字 –