bc(1)

NAME
bc - 用于任意精度计算的语言

SYNTAX
bc [ -hlwsqv ] [long-options] [ file ... ]

VERSION
本手册页针对 GNU bc version 1.06。

DESCRIPTION 描述
bc 是一种语言，支持任意精度的数字以及交互的计算过程。它的语法与 C 程序设计语言类似。可以在命令行中指定标准的 math 库。如果指定的话，math 库将在处理其他文件之前生效。 bc 从处理命令行列出的文件开始，处理的顺序就是列出的顺序。所有文件都被处理之后，bc 读标准输入。所有输入都将被执行。(如果某个文件包含了使处理器停机的指令，bc 将不再读标准输入。)

这个版本的 bc 与传统 bc 和 POSIX 标准草案相比，包含多个扩展。可以用命令行选项来使得这些扩展输出警告消息或不使用它们。本文档描述处理器接受的语言，扩展将被标记出来。

  OPTIONS 选项

-h, --help
    打印用法，然后退出。

-i, --interactive
    强制交互模式。

-l, --mathlib
    定义标准 math 库。

-w, --warn
    为对 POSIX bc 的扩展输出警告。

-s, --standard
    只处理标准的 POSIX bc 语言。

-q, --quiet
    不打印一般的 GNU bc 欢迎消息。

-v, --version
    打印版本号和版权信息，然后退出。

  NUMBERS 数
bc 中最基本的元素是数。数是任意精度的数字。精度包括整数部分和小数部分。数在内部以十进制表示，所有计算以十进制完成。(这个版本截断除和乘运算的结果。)数有两种属性，长度 (length) 和精度 (scale)。长度是数中十进制有效数字的个数，精度是小数点后十进制数字的个数。例如：
     .000001 has a length of 6 and scale of 6.
     1935.000 has a length of 7 and a scale of 3.

  VARIABLES 变量
数保存在两种类型的变量内，简单变量和数组。简单变量和数组都是命名的。名称以字母开始，跟随任意多位的字母，数字或下划线。所有字母必须都是小写。(完整的 alpha-numeric 名称是一个扩展。POSIX bc 中只允许变量名为单个小写字母。)变量的类型由上下文决定，因为所有数组变量名后面应该跟随方括号 ([])。

有四个特殊变量，scale, ibase, obase, 和 last。 scale 定义了某些操作如何使用小数点后的数字。scale 的默认值是 0。 ibase 和 obase 定义了在输入和输出数字之间的数制转换。输入和输出的默认基数都是 10。last (属于扩展) 是一个变量，保存了上一次输出的数字。它们将在后面合适的位置详细讲述。在表达式中应用它们时，它们都可能已被赋值。

  COMMENTS 注释
bc 中的注释以字符串 /* 开始，以字符串 */ 结束。 注释可以出现在任何地方，在输入中被视为单个空格。(这使得注释将其他输入对象分开。例如，在变量名中间不可能出现注释。)注释包含从注释的开头到结尾之间的任何新行符 (EOL)。

要支持使用 bc 书写脚本，加入了单行注释的扩展。单行注释以 # 起始，到行末结束。新行符不是注释的一部分，被正常地处理。

  EXPRESSIONS 表达式
数字以表达式和语句进行操纵。由于语言设计为适于交互使用，语句和表达式都被立即执行。没有 ``main'' 函数。代码在解析之后马上被执行。(函数，后面将详细讲述，在解析之后马上被定义。)

最简单的表达式只包含一个常数。bc 将常数转换为内部十进制数，使用当前的输入基数，以 ibase 设定。(函数除外。) ibase 的有效值是 2 到 16。赋予 ibase 超过 16 的值，将得到 2 或 16。输入的数字可以包含字符 0-9 和 A-F。(注意：它们必须是大写。小写字母是变量名。)一位的数字的值总是这一位的值，不管 ibase 的值是什么。(例如，A=10。)对于多位数字，bc 将所有大于或等于 ibase 的数位转换为 ibase-1。这样做使得数字 FFF 总是输入基数的最大的 3 个数位。 (? This makes the number FFF always be the largest 3 digit number of the input base.)

完整的表达式与很多其他高级语言类似。由于数只有一种类型，因此没有混合类型的规则。但是，存在关于表达式的精度的规则。每个表达式都有一个精度。它来源于操作数的精度和所进行的运算，在很多情况下还包括 scale 的值的影响。变量 scale 的合理值是 0 到 C 语言整数类型可以表示的最大数。

下面对正确的表达式的描述中，``expr'' 代指一个完整的表达式，``var'' 代指一个简单或数组变量。一个简单变量只要这样：
    name，
而一个数组变量应当指定为
    name[expr]
除非特殊指定，结果的比例是表达式涉及的精度的最大值。

- expr
    返回值是表达式取负。

++ var
    变量被加一，新值作为表达式的返回值。

-- var
    变量被减一，新值作为表达式的返回值。

var ++
    表达式的值是变量初值，变量被加一。

var --
    表达式的值是变量初值，变量被减一。

expr + expr
    表达式的返回值是两个表达式的和。

expr - expr
    表达式的返回值是两个表达式的差。

expr * expr
    表达式的返回值是两个表达式的积。

expr / expr
    表达式的返回值是两个表达式的商。 返回值的精度是变量 scale 的值。

expr % expr
    表达式的返回值是 "余下的部分"，它的计算方法乃是这样。要计算 a%b，首先计算 a/b 到 scale 位。结果被用于计算 a-(a/b)*b，结果的精度是 scale+scale(b) 和 scale(a) 间的最大值。如果 scale 设为 0 并且两个表达式都是整数，这个表达式就是整数的模运算函数。

expr ^ expr
    表达式的返回值是以第一个为底，第二个为指数的幂的值。第二个表达式必须是整数。(如果第二个表达式不是整数，将产生一条警告信息，表达式被截断来得到一个整数值。)结果的精度是 scale，如果指数是负值。如果指数是正值，返回值的精度是第一个表达式的精度乘以指数，以及 scale 与第一个表达式的精度中较大的一个，它们之间较小的一个。(例如，scale(a^b) = min(scale(a)*b, max( scale, scale(a)))。)应当注意，expr^0 总是返回 1。

( expr )
    括号调整了标准优先级，使得表达式总是被执行。

var = expr
    变量被赋予表达式的值。

var <op>= expr
    这样做与 "var = var <op> expr" 等价，但是 "var" 部分只被求值一次。如果 "var" 是一个数组，那么是有区别的。

关系运算是运算中较特殊的一种，结果总是 0 或 1，如果关系是假那么返回 0，如果关系是真那么返回 1。它们可以出现在任何合法的表达式中。(POSIX bc 要求关系运算只能用于 if，while 和 for 语句中，并且只能进行一个测试。)关系操作符包括：

expr1 < expr2
    返回值为 1，如果 expr1 严格地小于 expr2。

expr1 <= expr2
    返回值为 1，如果 expr1 小于或等于 expr2。

expr1 > expr2
    返回值为 1，如果 expr1 严格地大于 expr2。

expr1 >= expr2
    返回值为 1，如果 expr1 小于或等于 expr2。

expr1 == expr2
    返回值为 1，如果 expr1 等于 expr2。

expr1 != expr2
    返回值为 1，如果 expr1 不等于 expr2。

布尔运算也是可以的。(POSIX bc 没有布尔运算)。布尔运算的返回值总是 0 或 1 (代表假或真)，与关系运算相同。关系运算符包括：

!expr
    返回值为 1，如果 expr 为 0。

expr && expr
    返回值为 1，如果两个表达式都不为 0。

expr || expr
    返回值为 1，如果任何一个表达式不为 0。

表达式的优先级如下所示：(从低到高)
    || operator, 左结合
    && operator, 左结合
    ! operator, nonassociative
    Relational operators, 左结合
    Assignment operator, 右结合
    + and - operators, 左结合
    *, / and % operators, 左结合
    ^ operator, 右结合
    unary - operator, nonassociative
    ++ and -- operators, nonassociative

优先级如此设置是因为可以使 POSIX 兼容的 bc 程序正确运行。如果在赋值表达式中使用关系和逻辑表达式，可能带来奇怪的结果。例如：
    a = 3 < 5

大多数 C 程序员会认为这样做将使 "3<5" 的值 (值为 1) 赋予变量 "a"。但是，在 bc 中，实际发生的是将 3 赋予变量 "a"，然后将 3 与 5 比较。如果在赋值表达式中使用关系和逻辑运算符，最好使用括号。

bc 中提供了一些更特殊的表达式。它们用于对用户自定义函数和标准函数进行操作。它们的形式都是 "name(parameters)"。参见函数章节有关用户自定义函数的内容。标准的函数为：

length ( expression )
    length 函数的值是表达式 expression 中有效数字的位数。

read ( )
    read 函数 (属于扩展) 将从标准输入读入一个数字，不管什么时候调用它。小心，这样做会带来问题，因为数据和程序在标准输入混合到了一起。使用这个函数的最佳方式是在一个已写好的程序中，在需要用户输入值，但是决不允许用户输入程序代码的时候。read 函数的值是从标准输入读取的数的值，使用变量 ibase 的值作为转换的基数。

scale ( expression )
    scale 函数的值是表达式中小数点后的数的位数。

sqrt ( expression )
    sqrt 函数的值是表达式的平方根。如果表达式是负值，将产生一个运行时错误。

  STATEMENTS 语句
语句 (与大多数代数语言中相似) 提供了表达式求值的顺序。在 bc 中，语句被 "立即" 执行。一旦遇到新行符，并且已输入一个或多个完整的语句，那么执行就立即发生。由于执行立即发生，新行符在 bc 中非常重要。实际上，分号和新行符都可以作为语句的分隔符。如果新行符位置不正确，将导致语法错误。因为新行符是语句分隔符，可以用反斜杠来隐藏一个新行符。假设 <nl> 是新行符，序列 "\<nl>" 在 bc 看来就是空白而不是新行符。一个语句序列是一系列语句，以分号和新行符分隔。下面是一个 bc 的语句序列，以及它们做了什么：(包含在方括号 ([]) 内的内容是语句可选的内容。)

expression
    这个语句做两件事之一。如果表达式以 "<变量> <赋值> ..." 开始，它被认为是一个赋值语句。如果表达式不是一个赋值语句，那么表达式被执行，结果被输出出来。数字输出之后，还会打印一个新行符。例如，"a=1" 是一个赋值语句，而 "(a=1)" 是一个嵌入了赋值的表达式。所有打印的数字的基数都是变量 obase 指定的值。obase 的有效值是 2 到 BC_BASE_MAX。(参见 LIMITS 段落。)当基数在 2 到 16 之间时，使用通常的输出方法。如果基数大于 16，bc 使用多字符数字的方法来打印一个数，每个数位被打印成一个以 10 为基数的数字。多字节数字之间以空格分隔。每个数位包含足以表示 "obase-1" 的以 10 为基数的值那么多的字符。由于数字有任意精度，有些数字不能从一行全部输出。这些长数字将跨行显示，并且在每行末尾使用 "\" 作为最后一个字符。每行打印的最大字符数是 70。由于 bc 是交互的，打印一个数字的副作用是将所打印的值赋予特殊变量 last。这样做允许用户找回上一次的值，而不必重新输入上一次的表达式。为 last 赋值是合法的，并且将以新值覆盖上次显示的值。新值将保留，直到下一个数被打印出来，或者为 last 赋了其他值。(某些版本可能允许使用并非数的一部分的单个句点 (.) 来表示 last 的简写。)

string
    字符串被输出出来。字符串以一个双引号开始，包含所有的字符，直到下一个双引号为止。所有字符只包含字面意义，包括任何新行符。输出字符串之后，不会输出新行符。

print list
    print 语句 (属于扩展) 提供了另一个输出的方法。"list" 是一个字符串和表达式的列表，以逗号分隔。每个字符串或表达式以列表中出现的顺序进行输出。不会输出结束的新行符。表达式被求值，结果被输出出来并被赋予变量 last。print 语句中的字符串被输出出来，可能包含特殊字符。特殊字符以反斜杠 (\) 开始。bc 识别的特殊字符包括 "a" (警铃)，"b" (退格)，"f" (进纸)，"n" (新行符)，"r" (回车)，"q" (双引号)，"t" (跳格)，还有 "\" (反斜杠)。反斜杠之后的任何其他字符都将被忽略。

{ statement_list }
    这是组合语句。它允许多重语句被分组到一起来执行。

if ( expression ) statement1 [else statement2]
    if 语句对表达式进行求值，然后根据表达式的值，执行 statement1 或者 statement2。如果表达式非 0，将执行 statement1。如果有 statement2 并且表达式的值为 0，那么将执行 statement2。(else 子句属于扩展。)

while ( expression ) statement
    while 语句将执行 statement，只要表达式非 0。它在每次执行 statement 之前对表达式进行求值。如果表达式为 0，或者执行到了 break 语句，那么循环将终止。

for ( [expression1] ; [expression2] ; [expression3] ) statement
    for 语句控制重复执行 statement。Expression1 在循环之前被执行。Expression2 在每次执行 statement 前被求值。如果它非 0，就执行 statement。如果它为 0，循环将终止。每次 statement 执行完之后，在执行 expression2 之前，expression3 将被求值。如果没有 expression1 或 expression3，那么在应当执行它们的时候什么都不做。如果没有 expression2，那么与 expression2 为 1 的时候相同。(允许表达式不出现属于扩展。POSIX bc 要求所有三个表达式必须出现。)下列代码与 for 语句等价：
    expression1;
    while (expression2) {
       statement;
       expression3;
    }

break
    这个语句使得包含它的最近的 while 语句或 for 语句强行退出。

continue
    continue 语句 (属于扩展) 使得包含它的最近的 for 语句开始下一次循环。

halt
    halt 语句 (属于扩展) 是一个只执行的语句，也就是说它只在被执行时有效，它使得 bc 处理器退出。例如，"if (0 == 1) halt" 不会使 bc 停机，因为 halt 不会被执行。

return
    从一个函数中返回值 0。(参见函数章节。)

return ( expression )
    从一个函数中返回表达式的值。(参见函数章节。)一个扩展允许不出现括号。

  PSEUDO STATEMENTS 伪语句
这些语句不是传统意义上的语句。它们不是用来执行的语句。它们的作用在 "编译期" 发挥。

limits
    输出本地版本的 bc 强制的限制。属于扩展。

quit
    当读入 quit 语句时，bc 处理器将停机，无论是从哪里遇到了它。例如，"if (0 == 1) quit" 将使得 bc 停机。

warranty
    输出一个较长的保证通告。属于扩展。

  FUNCTIONS 函数
函数提供了定义一个计算的方法，这个计算可以延后执行。 bc 中的函数总是计算一个值并将它返回调用者。函数定义是 "动态的"，意思是一个函数是未定义的，直到输入中遇到了定义。然后这个定义一直被使用，直到遇到了同名的另一个函数定义。新的定义替换了旧的。函数以如下形式定义：
    define name ( parameters ) { newline
        auto_list   statement_list }
函数调用是一个这样形式的表达式 "name(parameters)"。

参数是数或者数组 (属于扩展)。在函数定一种，可以定义零个或多个参数，只要列出它们的名字，以逗号分隔。数字只传值。数组只传引用。 (? Numbers are only call by value parameters. Arrays are only call by variable.) 在参数定义中指定数组的形式是 "name[]"。在函数调用中，对于数字参数，实参是完整的表达式。如果要传递数组，形式与定义时相同。命名的数组以引用方式传给函数。由于函数是动态定义的，函数的参数个数与类型是在它被调用时进行检查的。任何参数个数或类型上的不匹配将导致一个运行时错误。如果调用未定义的函数，也会导致运行时错误。

auto_list 是一个可选的变量列表，用于 "局部"。auto 列表 (如果有的话) 的语法是 "auto name, ... ;"。(分号是可选的。)每个 name 是一个自动变量的名称。数组可以用参数定义中的形式来指定。这些变量的值在函数开始时被入栈。接着，它们的值被初始化为 0，并在函数的执行中被使用。在函数结束时，它们的值被弹出，使它们恢复为原值 (在函数调用时的值)。参数是自动变量，在函数被调用时初始化。自动变量与传统的局部变量不同，因为如果函数 A 调用函数 B，B 可以存取函数 A 的自动变量，只要使用相同的变量名，除非函数 B 中又将这些名字定义为自动变量。由于自动变量和参数总是被入栈，因此 bc 支持递归函数。

函数体是 bc 语句的列表。再一次的，语句以分号或新行符分隔。返回语句使得函数终止并返回一个值。有两种返回语句。第一种形式，"return"，向调用者返回 0。第二种形式，"return ( expression )"，计算 expression 的值并将它返回调用者。每个函数末尾都有一个隐含的 "return (0)"。这样做允许函数终止并返回 0，而不必明确写出 return 语句。

函数也会改变变量 ibase 的用法。函数体中的所有常量都将被转换，使用函数被调用时的 ibase 的值。在函数执行过程中对 ibase 的修改将被忽略，除了标准函数 read，因为它总是使用当前的 ibase 值来转换数制。

作为扩展，函数定义的格式可以稍微简单一些。标准中要求左花括号与关键字 define 在同一行，所有其他部分必须在后续行。这个版本的 bc 允许函数的左花括号之前和之后出现任意多个新行符。例如，下列定义是合法的。

    define d (n) { return (2*n); }
    define d (n)
      { return (2*n); }

  MATH LIBRARY 数学库
如果 bc 启动时有 -l 选项，将预先加载函数库，默认的精度被设为 20。math 函数将根据它们调用时的精度设定来计算结果。 math 库定义了如下的函数：

s (x)
    x 的正弦值，x 是弧度。

c (x)
    x 的余弦值，x 是弧度。

a (x)
    x 的反正切值，返回弧度。

l (x)
    x 的自然对数。

e (x)
    指数函数，e 的 x 次幂。

j (n,x)
    贝赛尔函数 (? The bessel function of integer order n of x.)

  EXAMPLES 例子
在 /bin/sh 中，下面的语句将 "pi" 的值赋予 shell 变量 pi。
    pi=$(echo "scale=10; 4*a(1)" | bc -l)

下面是 math 库中使用的指数函数的定义。函数以 POSIX bc 写成。

    scale = 20
    /* Uses the fact that e^x = (e^(x/2))^2
       When x is small enough, we use the series:
         e^x = 1 + x + x^2/2! + x^3/3! + ...
    */
    define e(x) {
      auto  a, d, e, f, i, m, v, z
      /* Check the sign of x. */
      if (x<0) {
        m = 1
        x = -x
      }
      /* Precondition x. */
      z = scale;
      scale = 4 + z + .44*x;
      while (x > 1) {
        f += 1;
        x /= 2;
      }
      /* Initialize the variables. */
      v = 1+x
      a = x
      d = 1
      for (i=2; 1; i++) {
        e = (a *= x) / (d *= i)
        if (e == 0) {
          if (f>0) while (f--)  v = v*v;
          scale = z
          if (m) return (1/v);
          return (v/1);
        }
        v += e
      }
    }

下面的代码，使用了 bc 的扩展特性来实现一个计算支票余额的简单程序。这个程序最好放在一个文件中，就可以使用多次了，而不必每次使用时重新输入一遍。

    scale=2
    print "\nCheck book program!\n"
    print "  Remember, deposits are negative transactions.\n"
    print "  Exit by a 0 transaction.\n\n"
    print "Initial balance? "; bal = read()
    bal /= 1
    print "\n"
    while (1) {
      "current balance = "; bal
      "transaction? "; trans = read()
      if (trans == 0) break;
      bal -= trans
      bal /= 1
    }
    quit

下面是递归的阶乘函数的定义。

    define f (x) {
      if (x <= 1) return (1);
      return (f(x-1) * x);
    }

  READLINE AND LIBEDIT OPTIONS readline 和 libedit 的选项
GNU bc 可以编译为 (通过一个编译选项) 使用 GNU readline 输入编辑库，或者使用 BSD libedit 库。这样做使得用户可以在将输入传给 bc 之前编辑它们。它还允许已输入内容的历史回顾。当选择了这一项时，bc 将拥有一个新的特殊变量 history。这个变量是历史中保留的行数。对于 readline，值为 -1 意味着将保留无限多行历史记录。设置 history 为一个正数，将限制历史行数为所设置的值。值为 0 将禁止历史功能。默认值是 100。阅读 GNU readline，history 和 BSD libedit 库的手册页来获取更多信息。不能同时使用 readline 和 libedit。

  DIFFERENCES 区别
这个版本的 bc 是根据 POSIX P1003.2/D11 草案实现的，与草案和传统实现相比有很多区别和扩展。它不是像传统方式那样使用 dc(1) 实现的。这个版本是单一的进程，解释并运行程序翻译后的字节码。有一个 "未载入文档的" 选项 (-c)，可以将字节码输出到标准输出，而不是运行它。这个选项一般用于调试解释器，以及设计 math 库。

区别的主要来源是扩展，有时一个特性被扩展来添加更多功能，有时新的特性被加入。下列是所有区别和扩展的列表。

LANG
    这个版本在处理环境变量 LANG 和所有以 LC_ 起始的环境变量时，不遵循 POSIX 标准。

names
    传统的和 POSIX bc 中函数，变量和数组名都是单个字母。它们已被扩展为支持多字符的，以字母开始，可以包含字母，数字和下划线字符的名称。

Strings
    字符串不允许包含 NUL 字符。POSIX 中要求所有字符都必须包含在字符串中。

last
    POSIX bc 没有 last 变量。bc 的某些实现使用句点 (.) 来做相似的事情。

comparisons
    POSIX bc 只允许在 if 语句，while 语句和 for 语句的第二个表达式中进行比较。同时，比较中只允许有一个关系操作。

if statement, else clause
    POSIX bc 不包含 else 子句。

for statement
    POSIX bc 要求 for 语句中所有表达式都出现。

&&, ||, !
    POSIX bc 没有逻辑操作符。

read function
    POSIX bc 没有 read 函数。

print statement
    POSIX bc 没有 print 语句。

continue statement
    POSIX bc 没有 continue 语句。

return statement
    POSIX bc 要求返回值表达式周围有小括号。

array parameters
    POSIX bc (当前) 不完全支持数组参数。POSIX 语法允许函数定义中使用数组，但是没有提供将数组指定为实参的方法。(这看上去像语法的疏漏。)传统的 bc 实现只有传值的数组参数。

function format
    POSIX bc 要求左花括号与关键字 define 在同一行，而 auto 语句在下一行。

=+, =-, =*, =/, =%, =^
    POSIX bc 不要求定义 "旧式的" 赋值操作符。这个版本可能允许这些 "旧式的" 赋值。使用 limit 语句来查看安装的版本是否支持它们。如果它确实支持 "旧式的" 复制操作符，表达式 "a =- 1" 将使 a 减一，而不是将 a 的值设为 -1。

spaces in numbers
    bc 的其他实现允许数中出现空格。例如，"x=1 3" 将值 13 赋予变量 x。这个语句在这个版本的 bc 中将导致语法错误。

errors and execution
    这个实现与其他实现的不同之处，包括当在程序中发现语法和其他错误时，执行的代码不同。如果在函数定义中发现语法错误，错误恢复将试图找到一个语句的起始，然后继续解释这个函数。如果在函数中发现语法错误，函数将成为未定义的，无法被调用。在交互执行的代码中的语法错误将使当前执行块作废。执行块以一个完整语句序列之后的 EOL 终止。 (? The execution block is terminated by an end of line that appears after a complete sequence of statements.) 例如，
    a = 1
    b = 2
有两个执行块，而
    { a = 1
      b = 2 }
只有一个。任何运行时错误将终止当前执行块的执行。运行时警告不会终止当前的执行块。

Interrupts
    在交互式会话中，SIGINT 信号 (通常由终端的 control-C 字符产生) 将使得当前执行块的执行被中断。它将输出一个 "运行时" 错误来指示哪个函数被中断了。在所有运行时结构被清理之后，将输出一条消息来通知用户 bc 已就绪，可以继续输入了。所有过去定义的函数依然是已定义的，所有非自动的变量的值都是中断时的值。所有自动变量和函数参数在清理过程中都被删除。在非交互会话中，SIGINT 信号将终止整个 bc 的运行。

  LIMITS
下列为这个版本的 bc 适用的限制。它们中某些可能被安装时的配置修改过。使用 limit 语句来查看实际的值。

BC_BASE_MAX
    当前，最大的输出基数被限制为 999。最大的输入基数是 16。

BC_DIM_MAX
    当前，这个限制是任意的，发行时是 65535，你的安装可能与此不同。

BC_SCALE_MAX
    小数点后数字位数被限制为 INT_MAX 位。同时，小数点前数字位数也被限制到 INT_MAX 位。

BC_STRING_MAX
    字符串中的字符数被限制为 INT_MAX 个字符。

exponent
    指数操作 (^) 中指数的值被限制为 LONG_MAX。

variable names
    当前，唯一的名称的个数被限制为 32767，包含简单变量，数组和函数。

ENVIRONMENT VARIABLES 环境变量
下列环境变量被 bc 所处理：

POSIXLY_CORRECT
    与 -s 选项相同。

BC_ENV_ARGS
    这是为 bc 设置参数的另一种机制。它的格式与命令行参数相同。这些参数被首先处理，因此环境变量中列出的任何文件都在命令行列出的文件之前处理。这样做允许用户在每次启动 bc 时，设置 "标准的" 选项和文件。环境变量中的文件典型的应当包含用户每次运行 bc 都会用到的函数定义。

BC_LINE_LENGTH
    这应当是一个整数，指定输出数时，输出行的字符个数。它包含针对长数字 (? lang number) 的反斜杠和新行符。

DIAGNOSTICS 诊断
如果命令行中任何文件无法打开，bc 将报告文件无法获取，然后退出。另外，还有其他编译期和运行时诊断消息，它们是自解释的。

BUGS
错误恢复还不是很好。

将错误报告用电子邮件发往 bug-bc@gnu.org。 确定在主题 (``Subject:'') 中包含 ``bc'' 这个词。

AUTHOR
Philip A. Nelson
philnelson@acm.org

ACKNOWLEDGEMENTS
The author would like to thank Steve Sommars (Steve.Sommars@att.com) for his extensive help in testing the implementation. Many great suggestions were given. This is a much better product due to his involvement.

TRANSBY
LinuxForum.Net CMPP 中文手册页计划 http://cmpp.linuxforum.net

* Sun Jun 20 2004 Yuan Yijun <bbbush@163.com>
- 初始版本