在调用 Pascal 的 "write" 过程时字段宽度为 1 的目的是什么?

What is the purpose of a field width of 1 in a call to Pascal's "write" procedure?

我注意到 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 中,如果 s"",则 printf("%s", s); 将不打印任何内容; printf("%1s", s); 将始终打印至少一个字符。但是 Knuth 正在打印整数,所以总是至少有一个字符要输出(0..9 范围内的整数的单个数字)。


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

The [arguments to the write procedure] have the following forms:

e:m e:m:n e

e表示要“写入”到[指定文件]上的值,m n 是所谓的字段宽度参数。如果值e, 它可以是数字、字符、布尔值或 字符串要求少于 m 个字符 代表,然后发出足够数量的空白 这样就可以准确地写入 m 个字符。如果 m 被省略, 将采用实现定义的默认值。

ISO 7185 specification 的说法大致相同。) 根据我的经验,当谈到格式化输出中的字段宽度时,规范通常指定仅在提供最小宽度时才打印填充字符。例如参见 [​​=39=],条款 7.21.6.1。但是 Pascal 的描述意味着一个实现可以将默认最小值设置为 5,在这种情况下,上面 Knuth 摘录的输出可能看起来像

! Missing 2 )'s

是否未指定宽度。那么1的值就变得完全可以防御了。

是的,它只是确保没有前导空格。 ISO standard 7185 says:

Write(f, e) shall be equivalent to the form write(f, e:TotalWidth), using a default value for TotalWidth that depends on the type of e; for integer-type, real-type, and Boolean-type, the default values shall be implementation-defined.

一些 Pascal 编译器在 整数类型 write 参数上有 TotalWidth 的“实现定义”默认值,例如,20,这对于您的 TANGLE 源代码片段中的那种输出来说根本不是很好,您看到了吗?

text 文件中的 write/writeLn 程序主要旨在生成人类可读的 清晰 输出。如果您逐行打印 几个 数值,您 do 希望它们 右对齐 .对于这个用例,很好,你知道,你不需要每次:20(或常量的名称)额外指定

请注意,在 Extended Pascal ISO 10206 中,它引入了数据类型 string 写入参数 TotalWidth 格式说明符 charstring 表示 the exact width, i. e.这可能 clip 输出(或像往常一样用空格填充)。例如 write('Foobar':0) 将(在 EP 中)打印 nothing。这与等效的 printf.

不同