是否可以从左到右而不是从右到左更改参数调用行为(第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
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;
答案 0 :(得分:6)
没有。 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;
因为语言表示可以按任何顺序评估数组组件。