01/10/2018, 00:29

PHÉP OR trong JAVA

Chào mọi người, mình có vấn đề dưới đây:

   int i = 0;
    	boolean t = true;
    	boolean f = false, b;
    	
    	b = (t | ( (i++)== 0));

vì sao chỗ này i ko đc gán i==0 mà khi debug nó vẫn ra là 1 vậy ạ, kết quả là 1 |1 =1

Đỗ Nhiên viết 02:42 ngày 01/10/2018

biến b của bạn là biến boolean à mà thường phép or trong java là || mà bạn

mmmm viết 02:31 ngày 01/10/2018

dạ đây là phép or theo bit đó ạ

Đỗ Nhiên viết 02:43 ngày 01/10/2018

yêu cầu của bài toán là gì hả bạn

mmmm viết 02:43 ngày 01/10/2018

in ra màn hình giá trị của b

anon52681320 viết 02:44 ngày 01/10/2018

Khi gọi i++ == 0 có nghĩa là sẽ đem i so sánh trước rồi mới tăng lên 1 đơn vị sau. Nếu chỗ này muốn nó trả kết quả false thì em phải ++i thay vì i++.
Btw, phép tử | là or theo bit, thường được dùng để làm điều kiện cho kiểu dữ liệu boolean, short và int còn || mới đúng là or điều kiện.

Đỗ Nhiên viết 02:41 ngày 01/10/2018

thay bằng ++i nó vẫn in tra true mà bạn

mmmm viết 02:42 ngày 01/10/2018

Mặc dù là nó đã được bỏ trong ngoặc như thế này (i++) nhưng nó vẫn làm == trước ạ? mà phép ==0 ở đây là gán hay so sánh ?
Gỉa dụ b = (t ||( (i++)== 0)); thì nó lại đc gán về bằng 0 ???
Vẫn chưa hiểu lắm, có thể giải thích thêm đc ko ạ

Tao Không Ngu. viết 02:34 ngày 01/10/2018

Mình đoán mò thôi

int i = 0; // i = 0 OK.
    	boolean t = true; // t = true OK.
    	boolean f = false, b; // f = fale không dùng b = false.

    	b = (t | ( (i++)== 0)); // Tăng i = 1, So sánh 1 == 0 false. OR true -> true. b = true.
//Trong java true là true 1 là 1 không có 1 là true true là 1.

Mình đoán mò thôi.

anon52681320 viết 02:34 ngày 01/10/2018

thay bằng ++i nó vẫn in tra true mà bạn

Vẫn chưa hiểu lắm, có thể giải thích thêm đc ko ạ

true là do cái phần t nó làm cho true: t = true = 1 trong nhị phân (bit) => t | ((i++) ==0) tương đương 1 | 1 => true
Còn tại sao lại là 1 | 1 thì do tính chất toán tử ++. Nếu nó nằm sau biến thì sẽ thực hiện phép so sánh xong rồi mới cộng sau cùng, còn nằm đằng trước biến thì sẽ cộng rồi mới thực hiện phép so sánh.
Phép == là phép so sánh, đừng nhầm lân với phép gán =

mmmm viết 02:30 ngày 01/10/2018

theo bạn nói vậy có nghĩa là so sánh vậy nếu thay bằng câu lệnh này b = (t ||( (i++)== 0)); thì i=0 vậy nghĩa là == là phép gán hay so sánh đây?

mmmm viết 02:39 ngày 01/10/2018

b = (t ||( (i++)== 0)); vậy tại sao in ra chỗ này i =0 nếu nói như trên là so sánh ==0 rồi ++ thì chỗ này i phải bằng 1 chứ. (CHỖ NÀY LÀ DẤU || KHÁC VỚI CÂU ĐẦU)

anon52681320 viết 02:45 ngày 01/10/2018

Câu hỏi khá đấy :D. Nếu chỗ này em sử dụng toán tử || vào thì nó đặc điểm là nếu vế đầu đúng, thì vế sau sẽ không cần phải xử lý nữa (khác với toán tử | , phải xử cả 2 vế). Cho nên em không thấy cái i nó tăng lên 1, để nó tăng lên 1 em có thể sửa t = false.

mmmm viết 02:30 ngày 01/10/2018

Cảm ơn câu trả lời vừa rồi của anh ạ. Đã hiểu nhưng còn chỗ này thắc mắc

Nếu nó nằm sau biến thì sẽ thực hiện phép so sánh xong rồi mới cộng sau cùng, còn nằm đằng trước biến thì sẽ cộng rồi mới thực hiện phép so sánh.

có phải là do tính chất phép ++ là thực hiện từ phải sang trái ko ạ, hay là: nếu có phép so sánh và phép ++ thì nó thực hiện so sánh trước rồi ++ sau ạ.

Tao Không Ngu. viết 02:33 ngày 01/10/2018

Like! ^_^!
Đây là một chú ý khi code được 1 thời gian.
*Mới code

boole status1 = function1();
boole status2 = function2();
if(status1 || status2) {
//TODO
}
//Cả hai hàm function* đều được thực hiện.

*Code được 1 thời gian

if(function1() || function2()) {
//TODO
}
Code có lúc chạy cả hai hàm có lúc không gây lỗi và rất khó bug.

*Code nhiều.

if(function1() || function2()) {
//TODO
}
// Các hàm được viết lại theo cách linh hoạt hơn nên không lỗi.
Tao Không Ngu. viết 02:37 ngày 01/10/2018

Trong ngoặc trước ngoài ngoặc sau.
Thứ tự ưu tiên toán tử. Tuy nhiên đôi khi có sự không nhất quán trong thực hiện thứ tự phép toán.

anon52681320 viết 02:36 ngày 01/10/2018

Chỗ này do em đặt ++ ở đâu thôi. Đặt trước biến: ++i thì nó gọi là pre-increment. Nó tương đương với code

i = i + 1;
boolean test = (i == 0);

Còn i++ gọi là post-increment. Nó tương đương với code

boolean test = (i == 0);
i = i +1;

mmmm viết 02:38 ngày 01/10/2018

Dạ, em cảm ơn nhiều ạ.

Bài liên quan
0