我是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位机器溢出。 –