2

ISO パスカル標準に従って、このプログラムの正しい動作が何であるかを見つけることができません。ISO 7185 規格の文書を読み込もうとしましたが、このトピックに関するものは見つかりませんでした。結果 4 または 24 はどうなるでしょうか?

program Undetermined;
var
   n: Integer;

function fact: Integer;
begin
   fact := 1;
   if n > 1 then
   begin
      n := n - 1;
      fact := (n + 1) * fact
   end
end;

begin
   n := 4;
   writeln( fact )
end.

編集:私の例には2番目の問題があることに気付きました。したがって、新しいコードを検討してください:

program Undefined;
var
   n: Integer;

function power2: Integer;
begin
   power2 := 1;
   if n > 0 then
   begin
      n := n - 1;
      power2 := 2 * power2
   end
end;

begin
   n := 4;
   writeln( power2 )
end.

結果は 16 または 2 になるはずです (私のコンパイラによると) ?

編集:私の問題が解決しなかった場合は、回答イベントに感謝します。私は最終的に他のフォーラムで正しい答えを得ました.ISO標準は私が期待した動作を指定していますが、私が使用するコンパイラ(fpc)はデフォルト設定でその点の標準に準拠していません.

4

2 に答える 2

2

ここには2つの別々の問題があります。

  1. fact関数の結果、または再帰呼び出しを示しますか?
  2. 再帰呼び出しを示している場合、結果24または実装は定義されていますか?

1.fact関数の結果、または再帰呼び出しを示しますか?

fact割り当ての左側では発生しないため、関数の結果に対応していないため、関数を再帰的に呼び出す必要があります。このコンテキストでのコンパイラの扱いfactfact()違いは、バグのように聞こえます。

標準は言う:

アクティベーション内で、ラベルまたは変数識別子、あるいはアクティベーションのブロックにローカルなプロシージャ識別子または関数識別子の適用されたオカレンスは、それぞれ、対応するプログラムポイント、変数、プロシージャ、または関数を示すものとします。その活性化の; ただし、代入ステートメントの関数識別子は、その関数識別子によって示される関数のアクティブ化の範囲内で、そのアクティブ化の結果を示すものとします。

2.再帰呼び出しを示している場合、結果24または実装は定義されていますか?

再帰関連の問題を無視してを使用fact()しても、常に結果が得られるとは限りません24

要約すると、「式の最初に評価されます(n+1)か?fact()(n + 1) * fact

評価の順序は、この場合に定義された実装です。これは、標準に準拠したさまざまな実装がさまざまな結果をもたらす可能性があり、それらすべてに期待できるわけではないことを意味し24ます。

標準を引用するには:

6.7.2演算子

6.7.2.1一般


表3| 二項算術演算

...
*乗算
..。


因子、項、または単純式は、オペランドとして指定する必要があります。二項演算子のオペランドの評価の順序は、実装に依存するものとします。

注| これは、たとえば、オペランドがテキスト順、逆順、または並列で評価される場合と、両方が評価されない場合があることを意味します。

于 2012-08-10T09:39:53.803 に答える
1

Free Pascal の ISO ダイアレクト モードは非常に若い (1 ~ 2 年) ため、FPC は通常 Borland であり、ISO 指向のコンパイラではありません。

Mac Pascal モードはよりテストされており、一般的に非常に ISO に似ています。macpascal モードでコンパイルすると、() なしの "16" という回答が得られます。

おそらく、ISO モードでも同じことを行う必要があり、戻り値が疑似変数であるような borland/delphi を使用しないでください。バグを報告してください。

于 2012-08-23T00:47:13.923 に答える