2012-05-09 38 views
6

Phần tôi tiếp tục gặp khó khăn là boolean(0 % 2 !=0) == sai. Tôi có nghĩa là nếu 2 đi vào 0, 0 lần sau đó phần còn lại sẽ là 2, và 2 không bằng 0. Vì vậy, nó phải là sự thật. Tuy nhiên, khi tôi đặt boolean trong chương trình java của tôi nó được coi là sai. Có ai biết tại sao không?`java (0% 2! = 0) == false`

Câu trả lời hợp lý duy nhất tôi có thể quấn quanh đầu là có thể các số nguyên đi vào 0 và vô hạn số lần và được nhận dạng là sai, bất kỳ ai?

+0

Tôi thực sự không phải là lỗi mã hóa, tôi đã sao chép trực tiếp từ sách của mình, nó cũng được tham chiếu nhiều lần trong bài giảng của tôi. – Michael

+0

Đó là ... không phải những gì '%' có nghĩa là. –

Trả lời

24

Có hai bước:

  • 0 % 2 đánh giá để 0.

  • 0 != 0 đánh giá là false.

Để xây dựng trên những bước đầu tiên, JLS defines các nhà điều hành % như vậy:

Nhà điều hành% nhị phân được cho là mang lại phần còn lại của toán hạng của nó từ một bộ phận ngụ ý; toán hạng bên trái là cổ tức và toán hạng bên phải là số chia.

Phần còn lại chia 0 bởi 20 và không 2 như bạn có vẻ suy nghĩ.

+5

Tôi thường không thực sự +1 những thứ cơ bản, nhưng vì một lý do lạ lùng nào đó, điều này làm tôi cười. – Mysticial

2

% trả về phần còn lại sau khi chia. Zero chia cho bất cứ thứ gì (ngoại trừ chính nó!) Bằng không, vì vậy không còn lại.

Do đó 0 % 20.

+4

Zero chia cho bất cứ điều gì * ngoại trừ số không * là số không – aioobe

+0

Toán học hiện đại này rất khó hiểu :-) –

+0

Ha ha, bắt tốt :) Đã sửa lỗi! –

4

0% 2 = 0, vì 0/2 = 0 và nhắc nhở 0 hoặc 0 * 2 + nhắc nhở = 0.

bạn chỉ hiểu lầm mô đun.

0

nếu 2 đi vào 0, 0 lần sau đó phần còn lại sẽ là 2.

nó không phải là 2 goes into 0 nhưng 0 goes into 2, vì vậy kết quả của devision kiến ​​0 và sự nhắc nhở là 0.

+1

Bạn có nghĩa là "phân chia" và "phần còn lại" ... (Nhắc nhở là những gì bạn viết trên một ghi chú Postit, và sự phân chia không phải là một từ tiếng Anh ... mặc dù nó có thể là một ngôn ngữ cho một hình thức tra tấn thời trung cổ. "tù nhân bị đưa đến ngục tối và" bị thương "với một bài poker nóng đỏ".) –

1

Tôi nghĩ bạn trộn 0% 2 và 2% 0 (điều này là không thể). 0% n luôn bằng 0.

Ok, chúng ta hãy phân tích rằng ...

1) 0 % 2

modulo là phần còn lại của bộ phận hữu hạn. Ví dụ 10% 3 là phần còn lại của ngày 10/3. 10/3 là 3 + ⅓. Vì vậy, phần còn lại là 1.

0% 2 là phần còn lại của 0/2. 0/2 = 0, không có phần còn lại, do đó 0% 2 = 0.

2) 0 % 2 != 0

Nó có nghĩa là 0% 2 là khác nhau hơn 0. Bây giờ chúng ta biết đó là sai sự thật.

3) boolean(0 % 2 != 0)

Chỉ đơn giản là truyền. Bạn đưa kết quả vào một Boolean. Thay vì chỉ là giả định sai, nó nhận giá trị Java false.

4) boolean(0 % 2 != 0) == false

Các == có nghĩa là có một bài kiểm tra ở đây. Các thử nghiệm có thể được đơn giản hóa (như được hiển thị ở trên) là false == false. Có phải false bằng false không? Vâng. Kết quả là sau đó true.

0

Nó phải làm với Ưu tiên toán tử, đó là thứ tự các toán tử Java được đánh giá bởi trình thông dịch Java.

Xem here cho tài liệu. Một từ viết tắt hữu ích là BUDMASRELCA - B vợt, U nary, D IV- M ultiplication (trên thực tế nhân giống vì nó bao gồm modulo), Một ddittion- S ubtraction, R elational, E chất lượng, L ogical, C onditional (ternary), A ssignment. Tôi đã bỏ lỡ các toán tử Bitwise, nhưng chúng có thể được nhóm theo logic và chúng được ưu tiên hơn các toán tử logic bình thường.

0% 2! = 0 được đánh giá là 0% 2 (chất nhân) đầu tiên và sau đó nó được kết quả 0 được đánh giá với! = 0. (bình đẳng)

Bên trong, trình biên dịch xây dựng một cây biểu thức nhị phân để biểu diễn thứ tự như được hiển thị bên dưới cho trường hợp của bạn, sử dụng toán tử làm gốc và để lại dưới dạng giá trị hoặc toán tử khác (trong trường hợp đệ quy). Vì vậy, các cây con có các toán tử cần được đánh giá trước khi toán tử gốc có thể được đánh giá với giá trị của lá cây.

!= 
/\ 
% 0 
/\ 
0 2