2010-10-23 29 views
5

Làm thế nào điều này là không thể? Tôi bắt đầu biểu hiện bất hợp pháp.? Nhà điều hành không hoạt động

(s1.charAt(i) == ' ') ? i++ : break; 
+0

hoạt động này có hoạt động nếu bạn có nó trong vòng lặp [while, for, w/e]? – sova

Trả lời

24

Những điều cần hiểu ở đây là : điều hành được sử dụng để trở lại một giá trị. Về cơ bản, bạn đang gọi một chức năng giống như thế này trong dòng đó:

anonymous function: 
    if(s1.charAt(i) == ' '): 
     return i++; 
    else: 
     return break; 

Không có ý nghĩa, phải không? Nhà điều hành ?: chỉ được thiết kế dưới dạng viết tắt cho các câu trả lời nếu/else giống như trên, chứ không phải thay thế nếu/hoàn toàn khác.

4

Toán tử bậc ba là biểu thức chứ không phải là câu lệnh. Sử dụng if ... else ... cho việc này.

13

Bạn không thể sử dụng break trong một phần của biểu thức có điều kiện bậc ba là break không phải là biểu thức, mà chỉ là một câu lệnh điều khiển luồng.

Tại sao không chỉ sử dụng cấu trúc if-else thay thế?

if (s1.charAt(i) == ' ') { 
    i++; 
} else { 
    break; 
} 
3

Tất nhiên nó hoạt động. Nhưng đó là một nhà điều hành. Kể từ khi là một tuyên bố như 'phá vỡ' một toán hạng?

2

Tôi khuyên bạn nên tránh toán tử Ternary (? :) cho các bài tập đơn giản. Trong sự nghiệp của tôi, tôi đã thấy quá nhiều toán tử ternary lồng nhau điên cuồng; họ trở thành một nhức đầu duy trì (nhiều tình trạng quá tải nhận thức - "đừng làm tôi nghĩ!").

Tôi không cấm chúng trong nhóm của mình, nhưng đề xuất chúng được sử dụng một cách thận trọng. Sử dụng một cách cẩn thận họ sạch hơn nếu/xây dựng khác tương ứng: -

public int ifFoo() { 
    int i; 

    if(isSomethingTrue()) { 
     i = 5; 
    } 
    else { 
     i = 10; 
    } 

    return i; 
} 

So với phương án ternary: -

public int ternaryFoo() { 
    final int i = isSomethingTrue() 
       ? 5 
       : 10; 

    return i; 
} 

Phiên bản ternary là: -

  • ngắn
  • Dễ hiểu hơn (ý kiến ​​của tôi, tất nhiên!)
  • Cho phép biến là "cuối cùng"; giúp đơn giản hóa việc hiểu mã; trong một phương thức phức tạp hơn, ai đó đọc mã không biết mã nào sẽ thử và sửa đổi biến - một điều ít phải lo lắng hơn.
+3

'return isSomethingTrue()? 5: 10; 'sooo sạch hơn nhiều 10 dòng nếu câu lệnh và biến cục bộ vô dụng. – whiskeysierra

+0

Tôi chỉ đặt biến cục bộ để tôi có thể phá vỡ trên dòng đó nếu tôi cần gỡ lỗi. Không quá ồn ào, dù bằng cách nào! –

+0

Biến có thể là cuối cùng theo cách thực sự, miễn là nó được gán thông qua tất cả các đường dẫn mã trước khi sử dụng. – EJP