io - 在调用 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
表示要在[指定文件]上“写入”的值,并且m
和n
是所谓的字段宽度参数。如果 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 变得完全可以辩护。
解决方案
是的,它只是确保没有前导空格。ISO 标准 7185说:
Write(f, e)
应等价于表单,使用取决于类型的write(f, e:TotalWidth)
默认值;对于integer-type、real-type和Boolean-type,默认值应由实现定义。TotalWidth
e
一些 Pascal 编译器在TotalWidth
整数类型 write
参数(例如20
procedure write
/ writeLn
on text
files 的主要目的和设计是产生人类可读、清晰的输出。如果您要逐行打印多个数值,则确实希望它们与 right 对齐。对于这个用例,您不需要每次都:20
额外指定(或常量的名称) ,这很好,您知道。
请注意,在 Extended Pascal, ISO 10206 中,它引入了 data type string
,类型的写入参数的TotalWidth
格式说明符或表示确切的宽度,即。e. 这可能会剪辑输出(或像往常一样用空格填充它)。例如将(在 EP 中)打印nothing。这与等价物不同。char
string
write('Foobar':0)
printf
推荐阅读
- neo4j - 无法解析的日期:带有 APOC.DATE.PARSE 的“NULL”
- enums - Android Room 类型转换多种枚举类型
- mapbox - MapQuest 方向 api 返回的点太少
- r - R 自动更改日期格式
- swift - 如何快速对表格单元格中的同一按钮执行不同的操作?
- api - Google Vision:如何选择所有类型的检测
- wordpress - 如何减慢 WordPress 网站的速度
- grails - Grails 3.3.6 没有为命令 gradle docs 触发 DocStart 和 DocEnd 事件
- android - 如何以编程方式关闭运行时权限对话框?
- c# - 使用 Postsharp 在运行时更改属性类变量