是否可以从左到右而不是从右到左更改参数调用行为(第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;
Run Code Online (Sandbox Code Playgroud)
不是.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;
Run Code Online (Sandbox Code Playgroud)
声明部分中的各个项目保证按其出现的顺序进行评估.
需要注意的是这并没有解决的问题:
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;
Run Code Online (Sandbox Code Playgroud)
因为语言表示可以按任何顺序评估数组组件.