Parameters 更改参数调用行为
是否可以将参数调用行为(第25行)从左向右更改,而不是从右向左更改 底部的代码将3 2 1打印到控制台Parameters 更改参数调用行为,parameters,ada,Parameters,Ada,是否可以将参数调用行为(第25行)从左向右更改,而不是从右向左更改 底部的代码将3 2 1打印到控制台 with Ada.Containers.Vectors; with Ada.Text_IO; procedure Main is package Vector is new Ada.Containers.Vectors (Positive, Integer); V : Vector.Vector; procedure A (X, Y, Z : Integer) is
with Ada.Containers.Vectors;
with Ada.Text_IO;
procedure Main is
package Vector is new Ada.Containers.Vectors (Positive, Integer);
V : Vector.Vector;
procedure A (X, Y, Z : Integer) is
begin
Ada.Text_IO.Put_Line (X'Img & Y'Img & Z'Img);
end;
function B return Integer is
X : Integer := V.First_Element;
begin
V.Delete_First;
return X;
end;
begin
V.Append (1);
V.Append (2);
V.Append (3);
A (B, B, B);
end Main;
不是。Ada语言(和其他语言一样)说参数计算的顺序没有定义。您不能指望其他编译器,甚至同一编译器的不同版本以相同的方式运行。即使是同一个编译器,如果执行积极的优化,其行为也可能不同;在这样做时,它可以重新排列代码,而且由于编译器编写者知道该语言允许以任何顺序计算参数,因此他们可以在决定如何重新排列其内部树时利用该权限
一句话:如果你想让事情按一定的顺序进行,你就必须清楚地说明顺序。无论如何,它更具可读性,因为读者不会对正在发生的事情感到疑惑
begin
V.Append (1);
V.Append (2);
V.Append (3);
declare
Result1 : Integer := B;
Result2 : Integer := B;
Result3 : Integer := B;
begin
A (Result1, Result2, Result3);
end;
end Main;
声明性部分中的单个项保证按照它们出现的顺序进行评估
请注意,这不会解决问题:
begin
V.Append (1);
V.Append (2);
V.Append (3);
declare
type Three_Integers is array (1..3) of Integer;
Results : Three_Integers := (B, B, B); -- order is undefined!
begin
A (Results (1), Results (2), Results (3));
end;
end Main;
因为该语言表示数组组件可以按任何顺序求值。否。Ada语言(与其他语言一样)表示参数求值顺序未定义。您不能指望其他编译器,甚至同一编译器的不同版本以相同的方式运行。即使是同一个编译器,如果执行积极的优化,其行为也可能不同;在这样做时,它可以重新排列代码,而且由于编译器编写者知道该语言允许以任何顺序计算参数,因此他们可以在决定如何重新排列其内部树时利用该权限
一句话:如果你想让事情按一定的顺序进行,你就必须清楚地说明顺序。无论如何,它更具可读性,因为读者不会对正在发生的事情感到疑惑
begin
V.Append (1);
V.Append (2);
V.Append (3);
declare
Result1 : Integer := B;
Result2 : Integer := B;
Result3 : Integer := B;
begin
A (Result1, Result2, Result3);
end;
end Main;
声明性部分中的单个项保证按照它们出现的顺序进行评估
请注意,这不会解决问题:
begin
V.Append (1);
V.Append (2);
V.Append (3);
declare
type Three_Integers is array (1..3) of Integer;
Results : Three_Integers := (B, B, B); -- order is undefined!
begin
A (Results (1), Results (2), Results (3));
end;
end Main;
因为该语言表示数组组件可以按任何顺序求值。在调用中使用命名关联,首先使用
Z=>B
,可能会意外工作。然而,我怀疑编译器可能被允许对B的求值进行重新排序,因此这是一个很好的例子,说明了不纯函数的危险性!。。。Gnat至少似乎对参数评估进行了重新排序<代码>A(X=>B,Y=>B,Z=>B)代码>和A(Z=>B,Y=>B,X=>B)
两者返回相同的结果。在调用中使用命名关联,首先使用Z=>B
,可能会意外地起作用。然而,我怀疑编译器可能被允许对B的求值进行重新排序,因此这是一个很好的例子,说明了不纯函数的危险性!。。。Gnat至少似乎对参数评估进行了重新排序<代码>A(X=>B,Y=>B,Z=>B)代码>和A(Z=>B,Y=>B,X=>B)代码>两者返回相同的值。