2015-07-21 110 views
1

我剛剛得知,C++允許同樣的法律代碼:表達式生成錯誤

12; //just an expression -- expression statement to be exact 
int i = 45; 
(i > 0) ? i-- : 1; 

Altghough它可能不是最好的pracitce,我可以看到一些有用的情況,其中使用表達式作爲一個完整的語句可能幫助。所以,我只是想知道,爲什麼Java中沒有類似的功能?究竟是什麼阻止類似下面的代碼的原因:

public static void main (String[] args){ 
    func() + 1; // ERROR: NOT A STATEMENT 
} 

public static int func(){ 
    return 34; 
} 
+0

相關[Java:Not a statement](http://stackoverflow.com/questions/16599183/java-not-a-statement) –

+0

@FastSnail我的帖子與您提供的鏈接完全不同;我在問爲什麼表達式語句或像C++中的類似特性不包含在Java中。 – Michael

+1

「我可以看到一些有用的情況,其中使用表達式作爲完整的陳述可能有所幫助。」命名一個。就像爲什麼在使用'f()+ 1;'over'f();'(當然這也是一個表達式語句,但是在Java中允許)之後會有一個好處。 – sepp2k

回答

4

Altghough它可能不是最好的pracitce,我可以看到一些有用的情況,其中使用表達式作爲一個完整的語句可能幫助

在Java中完全允許使用表達式作爲語句(比如說System.out.println("hello"))。只是他們爲總是無副作用的表達式(如算術表達式)提供了明確的例外。沒有任何情況下,使用無副作用的表達式作爲語句會有任何影響(有用或無用)。

所以,我只是想知道,爲什麼在Java中沒有類似的功能?

你有錯誤的方式解決方法:這是Java中的功能,缺少在C

的東西像42;被允許使用C而不是Java的原因是,在C標準的語法定義有一條規則<stmnt> ::= <expression> ';'。 Java中存在相同的規則,但是在Java中它們添加了一個異常,將此規則應用於總是無副作用的表達式是非法的。他們增加了這條規則,因爲這樣的代碼永遠不會有任何效果,因爲程序員不可能有意編寫無意義的代碼,所以很可能是錯誤,因此應該被視爲一個。

請注意,添加異常的唯一缺點是它使標準稍微複雜一些(通過在語法中添加一個異常),並且使實現稍微困難一些(因爲現在編譯器需要檢測像這樣的代碼和會產生一個錯誤 - 儘管應該指出,如果不是所有的C和C++編譯器,現在使用的大多數(如果不是全部)編譯器也會檢測到這樣的代碼併爲此產生警告)。

+0

真棒回答! – Michael

+0

請注意,在C#中,像'a + b;'*這樣的代碼可能具有副作用(儘管它確實不應該),但它也是不允許的。 – svick