2011-04-28 119 views
0

java編譯器在這種情況下做了什麼?Java鑄造轉換?

for(int i=3;i< Math.sqrt(n);i=i+2) 

Math.sqrt返回double,所以沒有javac的擴大idouble

如果我想用int值回來,我需要重新投它嗎?

這實際上是如何工作的?

回答

4

是的,i被擴大爲臨時double作爲比較。 i本身的價值不受影響。

-3

在Java中沒有擴展,這個問題暗示了這個問題:「編譯器將我擴大到了一倍」。如果將一個變量定義爲int,它將始終爲int。在內部,某些類型的表示可能比所需要的更寬(例如,可能會將短數據存儲爲4字節而不是2),但這不受使用變量的方式影響/確定。

具體而言,在問題的循環描述中,編譯器發出的代碼將從Math.sqrt()返回的double轉換爲整數。

你可以把它當作如果編譯器重寫代碼如下:

for(int i=3; (double) i < (Math.sqrt(n)); i=i+2) 

(感謝誰評論人固定的代碼段。)

+0

我不相信這是真的。 – 2011-04-28 19:01:56

+1

不是;我被提升,而不是相反。 – 2011-04-28 19:03:07

+0

我想你可能會倒退... – 2011-04-28 19:03:44

2

Math.sqrt返回一個double Javac也擴展到了兩倍?

如果我想使用的int值後面將我需要重新投呢?

這是如何實際工作?

隨着原語,如果你有一個類型是更寬比其它在操作中,較小的被自動轉換爲您服務。

+1

解釋你對第二點的意思。要使用'int'作爲'int',即使它在比較過程中被隱式轉換,也不必將其轉換爲'int'。 – 2011-04-28 19:07:20

+0

僅供參考http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#170983 5.6.2二進制數字促銷 – 2011-04-28 19:12:13

1

語言規則說的是我將被提升爲double,然後與sqrt的返回值進行比較。

編譯器可以自由地執行任何它喜歡的操作,只要它導致相同的行爲。

我會驚訝,如果任何編譯器做任何事情,除了推廣我一倍,並做了比較。促銷在大多數架構上都很簡單便宜。 A 正確更快的替代方案將非常困難。