在调用 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
格式说明符 char
或 string
表示 the exact width, i. e.这可能 clip 输出(或像往常一样用空格填充)。例如 write('Foobar':0)
将(在 EP 中)打印 nothing。这与等效的 printf
.
不同
我注意到 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 formwrite(f, e:TotalWidth)
, using a default value forTotalWidth
that depends on the type ofe
; 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
格式说明符 char
或 string
表示 the exact width, i. e.这可能 clip 输出(或像往常一样用空格填充)。例如 write('Foobar':0)
将(在 EP 中)打印 nothing。这与等效的 printf
.