2010-10-23 76 views
5

這怎麼可能?我得到非法表達的開始。?操作員不起作用

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

如果你在[while,for,w/e]循環中有這個工作嗎? – sova 2010-10-23 09:17:29

回答

24

瞭解這裏的一點是,運算符用於返回一個值。你基本上調用了這樣的功能:

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

沒有意義吧? ?:運算符僅被設計爲if/else返回語句的簡寫,而不是if/else的替代。

4

三元運算符是一個表達式,而不是一個語句。爲此,使用if ... else ...

13

您不能在三元條件表達式的一部分中使用break,因爲break不是表達式本身,而只是一個控制流語句。

爲什麼不直接使用if-else構造呢?

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

當然,它的工作原理。但它是一個運營商。自從什麼時候發生諸如'打破'操作數的陳述?

2

我建議避開三元(?:)運算符,除了簡單的賦值。在我的職業生涯中,我看到了太多瘋狂的嵌套三元運算符;他們成爲維護頭痛(更多的認知超載 - 「不要讓我想!」)。

我不禁止他們在我的團隊,但建議他們明智地使用。使用精心它們比相應的if/else結構清潔劑: -

public int ifFoo() { 
    int i; 

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

    return i; 
} 

相比三元可供選擇: -

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

    return i; 
} 

三元版本是: -

  • 更容易理解(當然我的意見!)
  • 允許變量成爲「最終」;這簡化了代碼理解;在一個更復雜的方法中,閱讀代碼的人知道沒有進一步的代碼會嘗試和修改變量 - 更不用擔心。
+3

'return isSomethingTrue()? 5:10;如果聲明和無用的局部變量十分清晰, – whiskeysierra 2010-10-23 12:02:58

+0

我只放置局部變量,以便我可以在該行上斷點,如果我需要調試。不管怎樣,都不會過於臃腫! – 2010-10-23 21:26:50

+0

只要在使用前通過所有代碼路徑分配變量,該變量實際上可以是最終的。 – EJP 2010-10-25 11:03:50