首页 > 解决方案 > 在调用 Pascal 的“写入”过程时,字段宽度为 1 的目的是什么?

问题描述

我注意到 Donald Knuth 的 Pascal 代码程序中的几个实例实际上如下所示:

write(n:1);

例如,这里是TANGLE的第 166 节的释义(这样你就不必阅读整个程序) ;该error过程处理报告错误的位置。此代码是解析例程的一部分。的类型parenthesis_balance是整数的子范围。

if parenthesis_balance > 0 then
  begin if parenthesis_balance = 1 then writeln('! Missing )'); error
    else writeln('! Missing ', parenthesis_balance:1, ' )''s');
    while parenthesis_balance > 0 do
      begin insert_character(')'); parenthesis_balance := parenthesis_balance - 1;
      end;
  end;

在TeX的第 1334 节中可以找到更多案例。

有什么意义write(n:1)?似乎没有必要。通常,在您可以指定打印例程输出的最小字符数的情况下,唯一需要给出明确宽度 1 的情况是可能没有字符输出。例如,在 C 中,如果is ;printf("%s", s);将不打印任何内容。将始终打印至少一个字符。但是 Knuth 正在打印整数,因此总是至少要输出一个字符(范围内的整数的单个数字)。s""printf("%1s", s);0..9


我有一个假设。在原始的 Pascal 报告中,描述write包含以下内容:

[write过程的参数] 具有以下形式:

e:m e:m:n e

e表示要在[指定文件]上“写入”的值,并且mn是所谓的字段宽度参数。如果 valuee是一个数字、一个字符、一个布尔值或一个字符串,其表示所需的字符数少于m字符,则发出足够数量的空格,以便准确地m写入字符。如果m省略,将采用实现定义的默认值。

( ISO 7185 规范也说了很多。)根据我的经验,当涉及到格式化输出中的字段宽度时,规范通常指定仅在提供最小宽度时才打印填充字符。例如,参见ANSI Common Lisp 标准,第 22.3.4.1 节, C2x草案标准,第 7.21.6.1 节。但是 Pascal 描述意味着实现可以将默认最小值设置为 5,在这种情况下,上面 Knuth 摘录的输出可能看起来像

! Missing 2 )'s

宽度是否未指定。然后值 1 变得完全可以辩护。

标签: ioformattingpascal

解决方案


是的,它只是确保没有前导空格。ISO 标准 7185说:

Write(f, e)应等价于表单,使用取决于类型的write(f, e:TotalWidth)默认值;对于integer-typereal-typeBoolean-type,默认值应由实现定义。TotalWidthe

一些 Pascal 编译器在TotalWidth整数类型 write参数(例如20

procedure write/ writeLnon textfiles 的主要目的和设计是产生人类可读、清晰的输出。如果您要逐行打印多个数值,则确实希望它们与 right 对齐。对于这个用例,您不需要每次都:20额外指定(或常量的名称) ,这很好,您知道。

请注意,在 Extended Pascal, ISO 10206 中,它引入了 data type string,类型的写入参数TotalWidth格式说明符或表示确切的宽度即。e. 这可能会剪辑输出(或像往常一样用空格填充它)。例如将(在 EP 中)打印nothing。这与等价物不同。charstring write('Foobar':0)printf


推荐阅读