Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 更改参数调用行为_Parameters_Ada - Fatal编程技术网

Parameters 更改参数调用行为

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

是否可以将参数调用行为(第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;
不是。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)两者返回相同的值。