2015-08-12 17 views
5

Tôi chỉ cần chạy qua một cái gì đó kỳ lạ trong mã java của tôi:Câu lệnh trường hợp chuyển đổi java có thực hiện nhiều trường hợp cho các giá trị int không?

switch (result) { 
      case 0: 
       result_amount = 500; 
      case 1: 
       result_amount = 600; 
      case -1: 
       result_amount = 700; 
    } 

result là từ nguyên thủy kiểu int. Đối với các giá trị 1case 1case -1 được thực hiện.

Đây có phải là hành vi trường hợp chuyển đổi bình thường không? Nếu đúng thì tại sao?

+0

từ quan điểm của tôi, bạn cũng phải luôn khai báo mặc định ở cuối trường hợp chuyển đổi. –

+0

nhưng tại sao nó lại rơi vào trường hợp '-1'. Là '1' giống như '-1' cho trường hợp chuyển đổi? –

+1

Vì bạn chưa bao gồm câu lệnh 'break;' ở cuối mỗi trường hợp. – IKavanagh

Trả lời

8

Bạn cần phải sử dụng các từ khóa break sau khi một khối case:

switch (result) { 
     case 0: 
      result_amount = all_amounts[i]; 
     break; 
     case 1: 
      result_amount = all_amounts[i]; 
     break; 
     case -1: 
      result_amount = all_amounts[i+1]; 
} 

Tuyên bố switch sẽ làm một bước nhảy đến đúng case thẻ, sau đó thực hiện tất cả các mã mà làm theo, bỏ qua tiềm năng case thẻ khác. Bạn có thể xem xét tuyên bố switch giống như một số goto.

0

Nếu không có tuyên bố break trường hợp tiếp theo sẽ được thực hiện.

3

Rơi qua.

quoting from docs

Các báo cáo đột phá là cần thiết vì nếu không có họ, tuyên bố trong khối switch rơi qua: Tất cả các câu lệnh sau nhãn trường hợp khớp lệnh được thực hiện theo thứ tự, không phụ thuộc vào biểu hiện của trường hợp nhãn tiếp theo, cho đến khi một tuyên bố phá vỡ là gặp phải.

Bạn phải thêm break sau mỗi trường hợp.

  case 1: 
      result_amount = 600; 
      break; 
+1

ahhh đây là câu trả lời tôi đang tìm kiếm, cảm ơn! –

0
  1. Nói chung trường hợp Label Nên Integer/liên tục
  2. Số âm không có dấu thập phân cũng được coi như Integer
  3. Vì vậy nó không phải là cần thiết để có trường hợp Nhãn lớn hơn không

Đây là điều kiện fall through.

 switch (result) { 
       case 0: 
        result_amount = all_amounts[i]; 
       case 1: 
        result_amount = all_amounts[i]; 
       case -1: 
        result_amount = all_amounts[i+1]; 
     } 

Để tránh nó, bạn phải đặt break tuyên bố

 switch (result) { 
       case 0: 
        result_amount = all_amounts[i]; 
        break; 
       case 1: 
        result_amount = all_amounts[i]; 
        break; 
       case -1: 
        result_amount = all_amounts[i+1]; 
        break; 
     } 

Bây giờ chỉ phù hợp với trường hợp sẽ được thực thi.

0

Ghi:

Đây là một sai lầm mà hầu hết mọi người mới bắt đầu sẽ thực hiện. Đó là lý do tại sao tôi thích C# hơn. Nó không cho phép "mùa thu".

Điều bạn đã làm sai là bạn đã gặp phải thông báo chuyển đổi. Hãy thử sử dụng 0 làm giá trị của result. Nó sẽ đi qua tất cả các trường hợp. Khi một trường hợp chuyển đổi kết thúc thực hiện, trường hợp tiếp theo được thực hiện.Đó là lý do tại sao chúng ta cần thêm câu lệnh break; cho mỗi trường hợp của câu lệnh switch.

switch (result) { 
      case 0: 
       result_amount = 500; 
       break; 
      case 1: 
       result_amount = 600; 
       break; 
      case -1: 
       result_amount = 700; 
       break; 
} 

Nhưng đôi khi chúng tôi muốn xem qua. Ví dụ: khi chúng tôi muốn tính số ngày trong tháng:

switch (month) { 
    case 1: 
    case 3: 
    case 5: 
    case 7: 
    case 8: 
    case 10: 
    case 12: 
     days = 31; 
     break; 
    case 2: 
     days = 28; 
    case 4: 
    case 6: 
    //Lots of code... 
} 
0

Bạn nên bao gồm ngắt và mặc định để chạy chương trình theo cách phù hợp. Hãy để tôi cung cấp cho bạn một ví dụ về nó.

switch (result) { 
      case 0: 
       result_amount = 500; 
      break; 

      case 1: 
       result_amount = 600; 
      break; 
      case -1: 
       result_amount = 700; 
      break; 

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