运行该dc
实用程序时,如果我输入了一个非常大的数字,请说:
99999999999999999999999999999999999999999999999999999999999999
当我使用 打印出来时p
,我得到:
999999999999999999999999999999999999999999999999999999999999999999999\
999
Run Code Online (Sandbox Code Playgroud)
为什么它在 69 位后拆分输出?
至少对于 的 GNU 实现来说dc
,有DEFAULT_LINE_MAX
70 个字符的硬编码 - 尽管可以通过设置DC_LINE_LENGTH
环境变量来覆盖它。从dc/numeric.c
:
559 static int out_col = 0;
560 static int line_max = -1; /* negative means "need to check environment" */
561 #define DEFAULT_LINE_MAX 70
562
563 static void
564 set_line_max_from_environment(void)
565 {
566 const char *env_line_len = getenv("DC_LINE_LENGTH");
567 line_max = DEFAULT_LINE_MAX;
568 errno = 0;
569 if (env_line_len) {
570 char *endptr;
571 long proposed_line_len = strtol(env_line_len, &endptr, 0);
572 line_max = (int)proposed_line_len;
573
574 /* silently enforce sanity */
575 while (isspace(*endptr))
576 ++endptr;
577 if (*endptr || errno || line_max != proposed_line_len
578 || line_max < 0 || line_max == 1)
579 line_max = DEFAULT_LINE_MAX;
580 }
581 }
582
Run Code Online (Sandbox Code Playgroud)
所以
$ dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999\
999
q
Run Code Online (Sandbox Code Playgroud)
但
$ DC_LINE_LENGTH=0 dc
999999999999999999999999999999999999999999999999999999999999999999999999
p
999999999999999999999999999999999999999999999999999999999999999999999999
q
$
Run Code Online (Sandbox Code Playgroud)
终端传统上是 80x24(左右),在这样的比赛场地中,长线环绕可能有问题,这可能解释了 Unix 传统,即环绕长线并用\
.
这是一个非常古老的限制,dc(1)
在版本 6 AT&T UNIX源中包含:
dc1.s:ll: 70. /line length
Run Code Online (Sandbox Code Playgroud)
(使用复古计算的人可能会详细告诉您为什么长线是一个问题;人们可能会怀疑当时的行式打印机可能没有神奇的长线换行功能,因此对于正确打印的东西来说,它真的会需要适合页面...)