我是Fortran新手,但在我看來,Fortran的parameter
與在C/C++中使用#define
類似。他們是否相似?他們是以相同的方式使用嗎?我知道#define
是預處理器聲明,我不確定這可能會導致#define
與parameter
有什麼異同點。Fortran的參數語句是否類似於C/C++的#define語句?
回答
#define
是定義宏的預處理器語句。在預處理步驟中,宏將被它們的值替換。請注意,預處理器語句不是Fortran標準的一部分。並非每個編譯器都支持它們另一方面,
A parameter
表示命名常數(類似於C構造const
)。任何變量類型都可以用來聲明一個常量。此常數在編譯時定義:
integer, parameter :: i = 1
real, parameter :: a = 1.
complex,parameter :: z = (1., 1.)
parameter
更類似於在C/C的const
聲明++。這是一個不變的表達。
要獲得預處理器Fortran語言,你可以考慮使用.F擴展或力C預處理Fortran代碼
參數是確實是你給它一個名稱的恆定值。
#define預處理器命令有一個更廣泛和更強大的目標:它將字符串替換爲在程序文本中出現的任何位置。被替換的字符串可以是任何代碼片段。這是一種讓程序自行修改的方法(就在編譯之前)。
例如
#define Operator +
S= 1 Operator 2 Operator 3;
相當於
S= 1 + 2 + 3;
,你可以很容易地轉向
S= 1 - 5 * 2 - 5 * 3;
如果是有道理的。
誠然,這是一個古老的用法通過宏定義常量參數,
#define DAYS_PER_WEEK 5
#define PI 22/7
雖然編譯器有沒有良心,他們的參數,但仍純文本。在此示例中,1/PI
是1/22/7
,其評估爲1/154
而不是7/22
。
正如其他答案中的許多細節所述,具有parameter
屬性的對象是名爲常量的。該屬性可以在聲明中指定,例如Alexander Vogt給出的examples或使用parameter
聲明。
如果預處理被用作#define
,如
#define int_literal 1
然後,如在其他地方也覆蓋有文字級別的替換,在預處理階段,因此,我們所擁有的是那麼字面常量。
現在,爲什麼這個區別很重要?也就是說,有兩個片段
#define nx 100
real x(nx)
和
integer, parameter :: nx=100
real x(nx)
之間的真正區別?
不是很多,有人會想。然而,考慮
integer, parameter :: hello(*) = [1,2,3]
type(some_type), parameter :: tp = some_type(4,5,6)
我們將努力尋找合適的#define
s表示允許我們做任何我們想做的,就好像我們有那些命名常量。有了這些命名常量,我們可以有之類的東西
print *, hello(2)-PRODUCT(hello(1::2)), tp%b ! For b one of the components.
也就是說,命名常量是可以在異國情調的方式遠遠超過可以用文字文本替換希望被操縱的數據對象。
對於真正的病理,考慮傻例如
#define x 2.1
print *, 1/x
和
integer, parameter :: x=2.1
print *, 1/x
對於完整性,參數聲明的例子
integer i
parameter (i=1)
- 1. 是否有類似於Swift 3.0中的「If Any」的語句?Xcode
- 2. FORTRAN INQUIRE語句和FLEN參數
- 3. 類似於Couchbase中的SQL LIKE語句
- 4. UPDATE語句格式類似於INSERT語句
- 5. 是否有Fortran等價於Python的for-else語句?
- 6. fortran中的等價語句
- 7. Fortran嵌套的WHERE語句
- 8. 如何使用#define語句
- 9. SQL類似語句問題
- 10. 用(或類似)語句
- 11. JavaScript是否具有與LINQ的Select語句類似的功能?
- 12. Fortran錯誤與FORMAT語句
- 13. Objective-C 2.0中是否有類似Matlab的eval語句?
- 14. Fortran傳遞語句函數到函數
- 15. 如何在XSLT中執行類似語句或等效語句
- 16. pandas中類似SQL的語句?
- 17. 重構2個類似的if語句
- 18. 結合類似的jQuery語句
- 19. Fortran中的CPP預處理語句是否可以縮進?
- 20. 語句之間的語義相似性
- 21. PDO(非仿真)語句是否跟蹤前面的語句?
- 22. 將命令行參數傳遞給類似於%語句的mysql查詢
- 23. grep語句不適用於case語句
- 24. Windows Batch是否有與BASIC的「數據」語句類似的東西?
- 25. 是否有SQL Select語句
- 26. 如何在Fortran語言使用語句函數與數組90
- 27. AND語句CASE PostgreSQL的內部參照類似condiitons
- 28. 可能把語句放到#define中嗎?
- 29. 在「if」語句中使用#define
- 30. 參數在SQL語句
但是'7/22'和'1/154'具有相同的值,所以不成問題, 對? :-) – rici
@rici:mh,154會導致6位機器溢出。 –