更改参数调用行为

时间:2014-03-14 14:12:37

标签: 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
   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;

1 个答案:

答案 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;

因为语言表示可以按任何顺序评估数组组件。