我正在使用gfortran編譯器。同時告訴我gfortran在執行自動類型轉換(類型轉換)時是否使用Fortran標準以外的其他東西。Fortran中的自動類型轉換(類型轉換)如何工作?
回答
賦值由Fortran 2008第7.2節定義。值得注意的是Cl。 7.2.1.3第8段:
對於固有賦值語句,其中變量是數字類型的,所述EXPR可以具有不同的數值 類型或種類的類型參數,在這種情況下expr的值被轉換爲變量類型和種類類型參數 根據表7.9的規則。
表7.9:數字轉換和賦值語句
Type of variable Value Assigned integer INT(expr , KIND = KIND (variable)) real REAL(expr , KIND = KIND (variable)) complex CMPLX(expr , KIND = KIND (variable))
這意味着任何表達式(expr
)將被隱式轉換爲它被分配給該變量的類型和種類。對於字符類型,派生類型和其他任何內容,請參閱標準。
另請注意,Fortran只在賦值和初始化期間執行此類轉換,但不會像過程調用那樣執行上下文。例如,請考慮以下過程:
subroutine sub1(a)
implicit none
integer :: a
print *, a
end subroutine
此過程具有integer類型的僞參數。例如,您不能這樣做:
call sub1(1.d0)
因爲這會導致實際參數和僞參數之間的類型不匹配。因爲隱式轉換爲分配定義
integer :: a
a = 1.d0 !implicitly interpreted as: a = INT(1.d0, kind=kind(a))
call sub1(a)
:
你可以,但是,做到這一點。
唯一記錄擴展在gfortran隱式類型轉換(5.1.0)的標準分配期間是邏輯和整數類型之間。
- 邏輯
.true.
被轉換爲整數1
- 邏輯
.false.
被轉換爲整數0
- 整數
0
轉換爲.false.
- 任何其他整數轉換爲
.true.
請注意,如果您可以不使用傳統擴展,那麼請不要使用它們。使用它們意味着你的程序不是標準的Fortran,因此任何編譯器都可以自由地拒絕它,因爲它是不正確的。此擴展旨在允許使用現代編譯器編譯舊代碼,而不是用於新代碼。
謝謝,但我的主要問題是所有在Fortran中進行的隱式類型轉換。 –
@YogeshYadav看我的編輯 – casey
- 1. Fortran變量類型轉換
- 2. C++自動「類型轉換的轉換
- 3. XAML自動類型轉換
- 4. VBA自動類型轉換
- 5. 自動類型轉換
- 6. Java中的自動類型轉換?
- 7. 類型轉換類
- 8. 轉換類型
- 9. 類型轉換
- 10. 類型轉換++
- 11. 轉換類型
- 12. 類型轉換++
- 13. 類型轉換()
- 14. 轉換類型
- 15. 轉換類型
- 16. 類型轉換
- 17. Java中的類型轉換和自動類型提升
- 18. JavaScript,帶「null」的自動類型轉換
- 19. 如何做類型轉換?
- 20. 如何轉換anynoymous類型?
- 21. 動態類型轉換
- 22. C#泛型類型轉換Decimal轉換爲Float - 「不能轉換類型'T1'? 'T2'「
- 23. 類類型轉換:爲什麼類型轉換功能不叫
- 24. 類型轉換 - 僅在循環中強制類型轉換?
- 25. 休眠自動類型轉換
- 26. casbah自動類型轉換爲Bigdecimal
- 27. Python自動轉換數據類型
- 28. 自動檢測/轉換數據類型?
- 29. 「顯式」阻止自動類型轉換?
- 30. ActiveRecord :: Base.store自動類型轉換
你爲什麼會想象gfortran表現不符合標準? –
我不是。我只是問,如果它確實如我所讀,有些編譯器使用非標準擴展。 –
我不明白爲什麼我一直在這裏downvoted。 –