2017-01-29 101 views
0

假設我有一個類ALGOL語言,用靜態類型和下面的一段代碼:靜態類型和轉換

a := b + c * d; 

其中a是浮點數,b的整數,c雙和d長。然後,語言將轉換d長期與c進行操作,並b翻番與c*d結果進行操作。因此,在此之後,b+c*d的雙重結果將被轉換爲浮點數,以將結果分配給a。但是,當它發生時,我的意思是,所有的轉換是在運行時還是編譯時間發生的?

如果我有:

int x; //READ FROM USER KEYBOARD. 
if (x > 5) { 
    a:= b + c * d; 
} 
else { 
    a := b + c; 
} 

上面的代碼具有條件語句。如果編譯器在編譯時將其轉換,則某些部分可能永遠不會運行。它是否正確?

回答

1

你不能這樣做在編譯時比你可以做一個除了在編譯時更多的轉換(除非編譯器可以判斷變量的值,也許是因爲它實際上是不變)。

編譯器可以(並且不會)發射與添加和相乘的變量的值的指令的程序。如果需要,它還會發出指令,在計算之前將存儲值的類型轉換爲其他類型。

不具有可變類型的固定在編譯時語言都必須執行在運行時檢查和有條件值轉換爲不同的類型。但我不認爲「Algol-like」這一大類中包含的任何語言都屬於這種情況。

+0

但是編譯器知道變量的類型,這很重要變量中的值? –

+1

@TomiSebastiánJuárez:編譯器可以發出執行轉換的代碼,因爲它知道變量類型是什麼。但它不能*做轉換*,除非它也知道變量的值。它與'a + a'沒有區別。如果編譯器知道'a'中的值是'2',它可以進行加法並用'4'替換表達式。否則,它所能做的就是發出代碼進行添加。 – rici

+0

非常清楚。謝謝 –