2013-12-13 17 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++; 
    } 
} 

そして、これは仕事をdoesntのコードです:これらの2つのコードスニペットの唯一の違い

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++; 
    } 
} 

は、if節での演算子です。

私はこれらの演算子の結果であると考え

:私の意見ではそう

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

2番目のコードスニペット:

&&オペレータ:

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

||オペレータ動作し、最初のスローする必要がありますa NumberFormatException。しかしそれはそうではありません。

私は何をしているのかにはより良い解決策があると確信していますが、私の質問は私のif文のロジックだけです。誰かが私の背後にある論理を説明することができますか?私は完全に混乱し、すべての助けの答えに感謝しています。第二のスニペットで

挨拶 ルーカスWarsitz

答えて

7

(それは同時に2及び5とすることができないので)iは、常にではない2か5になるため、IF-句は常に真となり

あなたの最初のスニペットをやりたいことはうまくいきます。それはあなたが望むものとまったく同じです:3番目の要素にも6番目の要素にもない場合は、解析する必要があります。その日に

+0

あなたの答えをしばらく考えた後、私はそれを理解しました。 –

3

キーポイントはここにある: & &で最初のケースがfalseの場合、後者の場合はチェックしません。

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 

とで

||最初のケースが真であれば、2番目のケースはチェックされません。

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 //両方がfalseであるためfalseを評価する" - 真ではない。最初のものは偽であるので、2番目のものはテストされていません –

+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 

& &と

上記のようである||結果に差がない場合は、2番目の値をテストしないショートカット演算子です。

& &

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

数、任意の数ピック。

したがって、式(i != 2 || i != 5)は、コンパイラによって静的に(true)に変換され、ifの制御構造が完全に削除されます。

明らかな結果は、の場合、の数字が数字でない場合、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

あなたのアドバイスありがとうが、私は誕生日から桁の合計を作成する必要があり、thatsなぜすべての単一の番号が必要です。 –

1

iは、一度に1つの値しか持つことができません。
したがって、次の条件のいずれかが有効です。

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)はLHS、いつでも

  1. ので、私= 2場合は常に真でありますi is not equal to 2はFALSEであり、RHS i is not equal to 5はTRUEです。
  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の略ですが、論理ORのためのものではありません; bitwise OR(http://stackoverflow.com/a/10142098/2982225);)気付いてくれてありがとう:) –

+1

よく私はあなたがbitwise ORを使用しているのを見ていない –