java編譯器在這種情況下做了什麼?Java鑄造轉換?
for(int i=3;i< Math.sqrt(n);i=i+2)
Math.sqrt
返回double
,所以沒有javac的擴大i
到double
?
如果我想用int
值回來,我需要重新投它嗎?
這實際上是如何工作的?
java編譯器在這種情況下做了什麼?Java鑄造轉換?
for(int i=3;i< Math.sqrt(n);i=i+2)
Math.sqrt
返回double
,所以沒有javac的擴大i
到double
?
如果我想用int
值回來,我需要重新投它嗎?
這實際上是如何工作的?
是的,i
被擴大爲臨時double
作爲比較。 i
本身的價值不受影響。
在Java中沒有擴展,這個問題暗示了這個問題:「編譯器將我擴大到了一倍」。如果將一個變量定義爲int,它將始終爲int。在內部,某些類型的表示可能比所需要的更寬(例如,可能會將短數據存儲爲4字節而不是2),但這不受使用變量的方式影響/確定。
具體而言,在問題的循環描述中,編譯器發出的代碼將從Math.sqrt()
返回的double轉換爲整數。
你可以把它當作如果編譯器重寫代碼如下:
for(int i=3; (double) i < (Math.sqrt(n)); i=i+2)
(感謝誰評論人固定的代碼段。)
Math.sqrt返回一個double Javac也擴展到了兩倍?
是
如果我想使用的int值後面將我需要重新投呢?
是
這是如何實際工作?
隨着原語,如果你有一個類型是更寬比其它在操作中,較小的被自動轉換爲您服務。
解釋你對第二點的意思。要使用'int'作爲'int',即使它在比較過程中被隱式轉換,也不必將其轉換爲'int'。 – 2011-04-28 19:07:20
僅供參考http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#170983 5.6.2二進制數字促銷 – 2011-04-28 19:12:13
語言規則說的是我將被提升爲double,然後與sqrt的返回值進行比較。
編譯器可以自由地執行任何它喜歡的操作,只要它導致相同的行爲。
我會驚訝,如果任何編譯器做任何事情,除了推廣我一倍,並做了比較。促銷在大多數架構上都很簡單便宜。 A 正確更快的替代方案將非常困難。
我不相信這是真的。 – 2011-04-28 19:01:56
不是;我被提升,而不是相反。 – 2011-04-28 19:03:07
我想你可能會倒退... – 2011-04-28 19:03:44