Io 调用Pascal';时字段宽度为1的目的是什么;s";写下;程序

Io 调用Pascal';时字段宽度为1的目的是什么;s";写下;程序,io,formatting,pascal,Io,Formatting,Pascal,我注意到Donald Knuth的Pascal代码程序中有几个实例,它们实际上如下所示: write(n:1); 例如,这里有一个释义(这样你就不需要阅读整个程序)的第166节;错误过程用于报告错误的位置。此代码是解析例程的一部分。括号的类型是整数的子范围 如果括号\u balance>0,则 如果括号_balance=1,则开始写入(“!Missing”);错误 else writeln(“!Missing”,括号_balance:1,”)“s”); 而括号_balance>0 do 开始插

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

write(n:1);
例如,这里有一个释义(这样你就不需要阅读整个程序)的第166节;
错误
过程用于报告错误的位置。此代码是解析例程的一部分。括号的类型是整数的子范围

如果括号\u balance>0,则
如果括号_balance=1,则开始写入(“!Missing”);错误
else writeln(“!Missing”,括号_balance:1,”)“s”);
而括号_balance>0 do
开始插入_字符(');圆括号\u balance:=圆括号\u balance-1;
结束;
结束;
更多案例见《公约》第1334节

写(n:1)有什么意义?这似乎没有必要。通常,在可以指定打印例程输出的最小字符数的情况下,唯一需要给出显式宽度1的时间是在可能不输出任何字符的情况下。例如,在C
printf中(“%s”,s)s
,则code>将不打印任何内容<代码>printf(“%1s”,s)将始终至少打印一个字符。但是Knuth正在打印整数,因此始终至少要输出一个字符(范围
0..9
内的整数为一个位数)


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

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

e:m
e:m:n
e

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

(英国人也这么说。) 根据我的经验,当涉及格式化输出中的字段宽度时,规范通常指定只有在提供最小宽度时才打印填充字符。例如,参见第7.21.6.1条。但是Pascal的描述意味着一个实现可以将默认的最小值设置为5,在这种情况下,上面的Knuth摘录的输出可能如下

!缺少2)


宽度没有指定。然后值1就完全可以辩护。

我相信你的假设是正确的,n:1确保编译器不使用默认字段宽度。我相信你的假设是正确的,n:1确保编译器不使用默认字段宽度。