2011-11-04 40 views
23
while(i <= j && i >= j && i != j) {} 

cách khai báo i và j để biến nó thành vòng lặp vô hạn?làm thế nào để khai báo i và j để làm cho nó là một vòng lặp vô hạn?

// đó là câu hỏi phỏng vấn mà tôi đã gặp.

nó yêu cầu những tuyên bố của i và j là gì, làm cho nó luôn đúng.

Và tôi không thể thực hiện bằng cách tuyên bố i và j là các loại số. Những loại nào khác có thể đáp ứng được?

+0

tôi ở đâu? .... – Kasturi

+0

@DJClayworth ý bạn là gì bởi phiên bản "' || "?" –

+0

@ Alan, rất tốt câu hỏi +1 – ELAYARAJA

Trả lời

38
Integer i=new Integer(1000); 
Integer j=new Integer(1000); 

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j)); 

ij sẽ được tự động không có hộp bọc để ints cho <=>=, nhưng không phải cho !=. ij là các trường hợp khác nhau, nhưng có cùng giá trị int. Đó là lý do tại sao cả ba so sánh sẽ trở lại đúng sự thật.

+2

tốt đẹp, tôi nghĩ rằng đó là câu trả lời đúng. Ít nhất nó đang trở lại đúng.// một câu hỏi phỏng vấn khó khăn !!! – Alan

+0

Chỉ cần đánh tôi với nó. – DJClayworth

+1

+1 'i <= j && i > = j && i! = J' [đánh giá thành' true' trong trường hợp này thì] (http://ideone.com/G1xjn) –

-2

Bất kỳ giá trị bình đẳng của 'i' và 'j' sẽ tiết lộ sự thật với báo cáo kết quả nhất định, nói:

Integer i = new Integer(1); 
Integer j = new Integer(1); 

while(i <= j && i >= j && i != j) {} 

Sự kỳ diệu là với nhà điều hành được sử dụng! Trong trường hợp! = Toán tử, trình biên dịch lấy toán hạng làm đối tượng (bao gồm cả giá trị của chúng) trong khi trường hợp> = hoặc < = trình biên dịch chỉ nhận giá trị toán hạng. Do đó, câu lệnh trên trả về true.

3

này hoạt động quá ("trên máy tính của tôi"):

Integer a = 128, b = 128; 

trong khi điều này sẽ không làm việc:

Integer a = 127, b = 127; 

Auto-boxing một int là cú pháp đường cho một cuộc gọi đến Integer.valueOf(int). Hàm này sử dụng bộ nhớ cache cho các giá trị từ -128 đến 127, bao gồm. Nó có thể bộ nhớ cache giá trị khác, nhưng trong trường hợp của tôi, nó không.

Do đó, việc gán 128 không có lần truy cập bộ nhớ cache; nó tạo ra một cá thể Integer mới với mỗi thao tác tự động đấm bốc và so sánh tham chiếu a != b là đúng sự thật. Nhiệm vụ 127 có một lần truy cập bộ nhớ cache và các đối tượng Integer kết quả thực sự là cùng một ví dụ từ bộ nhớ cache. Vì vậy, so sánh tham chiếu a != b là sai.

Điều tôi thực sự muốn chỉ ra là phải cẩn thận so sánh tham chiếu với tự động đấm bốc. Một vấn đề có thể xảy ra trong thế giới thực là bạn mong đợi a == b là true vì chúng được gán cùng giá trị (được tự động đóng), bạn chạy một số kiểm tra đơn vị xác nhận kỳ vọng của bạn, và sau đó mã của bạn bị lỗi "trong tự nhiên" khi một số bộ đếm vượt quá giới hạn trên của bộ nhớ cache. Thời gian vui vẻ!

+0

+1 Ngoài ra tuyệt vời cho [câu trả lời của Banthar] (http://stackoverflow.com/a/8015528/2932052)! – Wolf

Các vấn đề liên quan