Fortran 的参数语句是否与 C/C++ 的 #define 语句相似?
Is Fortran's parameter statement similar to C/C++'s #define statement?
我是Fortran的新手,但在我看来,Fortran的parameter
类似于在C/C++中使用#define
。它们相似吗?它们的使用方式相同吗?我知道#define
是一个预处理器语句,我不确定这可能会导致#define
与parameter
有什么相似之处或差异。
如其他答案中的许多细节所述,具有parameter
属性的对象是命名常量。该属性可以在声明中指定,例如在Alexander Vogt给出的示例中或使用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
,让我们可以随心所欲,就好像我们有那些命名的常量一样。有了这些命名的常量,我们就可以得到像这样的东西
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)
parameter
与C/C++中的const
声明更相似。它是一个常量表达式。
要在Fortran中获得预处理器,您可以考虑在Fortran代码上使用.F扩展或强制使用C预处理器
#define
是用于定义宏的预处理器语句。在预处理步骤中,宏将被其值替换。请注意,预处理器语句不是Fortran标准的一部分。并不是每个编译器都支持它们。
另一方面,parameter
表示命名常数(类似于C结构const
)。任何变量类型都可以用来声明常量。此常数在编译时定义:
integer, parameter :: i = 1
real, parameter :: a = 1.
complex,parameter :: z = (1., 1.)
PARAMETER实际上是一个常数值,您可以为其命名。
#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
。
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- c++:定义if语句中的模板
- 主线的等价语句是什么