bc命令
是一种语法,为任意精度算术语言提供解释器。
基本介绍
- 中文名:bc命令
- 外文名:bc
语法
bc [-hlwsqv][--long-option] [file-1 file-2 ...]--help
-------------------------------------------------------------------------------
--help
-h 显示选项页
-------------------------------------------------------------------------------
--interactive
-i 使用互动模式
-------------------------------------------------------------------------------
--mathlib
-l 执行指定语句前,先载入math函式馆
-------------------------------------------------------------------------------
--warn
-w 对非POSIX的bc指令给出警告
-------------------------------------------------------------------------------
--standard
-s 启动POSIX模式下的bc程式
-------------------------------------------------------------------------------
--quiet
-q 不显示GNU bc 的欢迎
-------------------------------------------------------------------------------
--version
-v 显示版本信息
-------------------------------------------------------------------------------
-c
--help
-h 显示选项页
-------------------------------------------------------------------------------
--interactive
-i 使用互动模式
-------------------------------------------------------------------------------
--mathlib
-l 执行指定语句前,先载入math函式馆
-------------------------------------------------------------------------------
--warn
-w 对非POSIX的bc指令给出警告
-------------------------------------------------------------------------------
--standard
-s 启动POSIX模式下的bc程式
-------------------------------------------------------------------------------
--quiet
-q 不显示GNU bc 的欢迎
-------------------------------------------------------------------------------
--version
-v 显示版本信息
-------------------------------------------------------------------------------
-c
相关档案
/usr/bin/bc 包含 bc 命令。
/usr/lib/lib.b 包含数学库。
/usr/bin/dc 包含桌面计算器
详情参见:$man bc
本文参考的bc的版本是Ubuntu 12.04 LTS的1.06.95版bc
用法示例请参见:bc用法部落格
描述
bc 命令是一个提供任意精度算术的互动式进程。bc 命令首先读取由 File 参数指定的任一输入档案,然后读取标準输入。输入档案必须是包含 bc 命令能读取并执行的命令序列、语句或函式定义的文本档案。
bc 命令是 dc 命令的预处理程式。除非指定 -c(仅编译)标誌,否则它自动调用 dc 命令。如果指定了 -c 标誌,则来自 bc 命令的输出转到标準输出。
bc 命令允许您来指定十进制、八进制或十六进制的运算的输入和输出进制。预设值为十进制。此命令还提供了十进制点符号的比例缩放规定。bc 命令始终使用 .(点号)来表示基数点,而不考虑指定为当前语言环境部分的任何十进制点字元。
bc 命令的语法类似于 C 语言的语法。可以使用 bc 命令通过将 ibase 关键字指定给输入进制而 obase 关键字指定给输出进制来在各进制间转化。2 到 16 的範围对于 ibase 关键字是有效的。obase 关键字的範围从 2 直到 /usr/include/sys/limits.h 档案中定义的 BC_BASE_MAX 值设定的限制。不考虑 ibase 和 obase 的设定,bc 命令将字母 A 到 F 识别为其十六进制值 10 到 15。
bc 命令的输出由读取程式控制。输出由包含所有执行的未赋值表达式的值的一行或多行构成。输出的基数和精度由 obase 和 scale 关键字的值控制。
有关 bc 命令处理来自源档案信息的方式的进一步的信息在以下各节中得到描述:
关键字
---------------------------------------------------------------------------------------------------
存储相关 auto
---------------------------------------------------------------------------------------------------
控制相关 if,else,for,while,break,continue
---------------------------------------------------------------------------------------------------
输出相关 print
---------------------------------------------------------------------------------------------------
函式相关 define,void,return
---------------------------------------------------------------------------------------------------
退出命令 quit,halt
---------------------------------------------------------------------------------------------------
预定义变数 ibase,obase,scale,last
---------------------------------------------------------------------------------------------------
预定义函式 length(expr),scale(expr),read(),sqrt(expr)
---------------------------------------------------------------------------------------------------
存储相关 auto
---------------------------------------------------------------------------------------------------
控制相关 if,else,for,while,break,continue
---------------------------------------------------------------------------------------------------
输出相关 print
---------------------------------------------------------------------------------------------------
函式相关 define,void,return
---------------------------------------------------------------------------------------------------
退出命令 quit,halt
---------------------------------------------------------------------------------------------------
预定义变数 ibase,obase,scale,last
---------------------------------------------------------------------------------------------------
预定义函式 length(expr),scale(expr),read(),sqrt(expr)
---------------------------------------------------------------------------------------------------
数据/输入/输出
1)任意精度的数值(精度包括整数部分的精度和小数部分的精度)
常量数值中间不允许有space
---------------------------------------------------------------------------------------------------
2) 内部使用浮点数存储,并且进行浮点数运算(乘/除进行趋零截断),内部
---------------------------------------------------------------------------------------------------
2) 内部使用浮点数存储,并且进行浮点数运算(乘/除进行趋零截断),内部
数据类型只有一种:浮点类型
---------------------------------------------------------------------------------------------------
3) 每个浮点数都有两个属性:【length】,【scale】
【length】:十进制格式中,小数部分数字位数和整数部分数字位数的和
【scale】 :十进制格式中,小数部分数字位数
---------------------------------------------------------------------------------------------------
4) 数据输入
1)有效的输入数值字元是 0 ~ 9和A ~ F(必须是大写字母)
2)当输入1位数(一个数字字元)时,它表示其原始数值含义(不管ibase是多少)
3)当输入多位数(多个数字字元的组合)时,bc将这个多位数视作ibase进制的数
---------------------------------------------------------------------------------------------------
5) 数据输出
1) 每行最多显示70个字元(查看BC_LINE_LENGTH环境变数)
2) 当精度要求很高的数字无法在一行内完全显示时,行尾添加 \ 符号表示
---------------------------------------------------------------------------------------------------
3) 每个浮点数都有两个属性:【length】,【scale】
【length】:十进制格式中,小数部分数字位数和整数部分数字位数的和
【scale】 :十进制格式中,小数部分数字位数
---------------------------------------------------------------------------------------------------
4) 数据输入
1)有效的输入数值字元是 0 ~ 9和A ~ F(必须是大写字母)
2)当输入1位数(一个数字字元)时,它表示其原始数值含义(不管ibase是多少)
3)当输入多位数(多个数字字元的组合)时,bc将这个多位数视作ibase进制的数
---------------------------------------------------------------------------------------------------
5) 数据输出
1) 每行最多显示70个字元(查看BC_LINE_LENGTH环境变数)
2) 当精度要求很高的数字无法在一行内完全显示时,行尾添加 \ 符号表示
该行和下一行在逻辑上是一行
变数
1) 两种形式存储数值:简单变数,数组
---------------------------------------------------------------------------------------------------
2) 变数命名
a) 变数名以小写字母开头,后跟若干小写字母,数字,下划线(必须且只能是小写字母)
》POSIX标準bc和传统bc中所有变数名(普通变数,数组变数,函式名)都是单一的一个小写字母
---------------------------------------------------------------------------------------------------
3) 变数命名
a) 数组变数后面会有[]符号
》POSIX标準不完全支持数组参数
1)允许在函式中函式定义中使用数组变数,但调用函式是如何传递数组参数则未定以
2)传统bc只能通过实参构成的数组调用函式
---------------------------------------------------------------------------------------------------
4) 预定义变数:scale,ibase,obase,last
四个预定义变数都可以在表达式中直接通过变数名使用;可以直接赋值给这四个预定义变数
-------------------------------------------------------------------------------------------
scale 对于一些操作,它指定了该操作如何处理小数部分
1)预定义变数scale的默认值是0
2)预定义变数scale的合法值是0 ~ C语言中最大整数值
-------------------------------------------------------------------------------------------
ibase,obase指定输入数值使用的进制ibase和输出数值使用的进制obase
a) 变数名以小写字母开头,后跟若干小写字母,数字,下划线(必须且只能是小写字母)
》POSIX标準bc和传统bc中所有变数名(普通变数,数组变数,函式名)都是单一的一个小写字母
---------------------------------------------------------------------------------------------------
3) 变数命名
a) 数组变数后面会有[]符号
》POSIX标準不完全支持数组参数
1)允许在函式中函式定义中使用数组变数,但调用函式是如何传递数组参数则未定以
2)传统bc只能通过实参构成的数组调用函式
---------------------------------------------------------------------------------------------------
4) 预定义变数:scale,ibase,obase,last
四个预定义变数都可以在表达式中直接通过变数名使用;可以直接赋值给这四个预定义变数
-------------------------------------------------------------------------------------------
scale 对于一些操作,它指定了该操作如何处理小数部分
1)预定义变数scale的默认值是0
2)预定义变数scale的合法值是0 ~ C语言中最大整数值
-------------------------------------------------------------------------------------------
ibase,obase指定输入数值使用的进制ibase和输出数值使用的进制obase
默认值ibase=obase=10
1)预定义变数ibase的合法值是2 ~ 16,此外的值被当作2/16处理
2)预定义变数obase的合法值是2 ~ BC_BASE_MAX
-------------------------------------------------------------------------------
a) 预定义变数obase的值在2 ~ 16,使用常用的数值显示方法
b) 预定义变数obase的大于16时:
1)用【多字元数字】显示转换后的数值,用空格分割【多字元数字】
2)每个【多字元数字】都是10进制(左补0对齐)
3)将预定义变数obase转换为10进制格式数字【OBASE10base】,
1)预定义变数ibase的合法值是2 ~ 16,此外的值被当作2/16处理
2)预定义变数obase的合法值是2 ~ BC_BASE_MAX
-------------------------------------------------------------------------------
a) 预定义变数obase的值在2 ~ 16,使用常用的数值显示方法
b) 预定义变数obase的大于16时:
1)用【多字元数字】显示转换后的数值,用空格分割【多字元数字】
2)每个【多字元数字】都是10进制(左补0对齐)
3)将预定义变数obase转换为10进制格式数字【OBASE10base】,
则每个【多字元数字】包含的10进制字元个数等于
(【OBASE10base】-1)中的10进制字元个数
例子
-----------------------------------------------------------------------
令预定义变数obase的值是100(十进制),即採用100进制格式输出
输入101(十进制),输出 01 01
1)【多字元数字】01和01,并间用空格分割
2)01和01都是十进制格式,并且左补0以满足【多字元数字】位数的要求
3)预定义变数obase转换为十进制后的值是100,则每个【多字元数组】包
例子
-----------------------------------------------------------------------
令预定义变数obase的值是100(十进制),即採用100进制格式输出
输入101(十进制),输出 01 01
1)【多字元数字】01和01,并间用空格分割
2)01和01都是十进制格式,并且左补0以满足【多字元数字】位数的要求
3)预定义变数obase转换为十进制后的值是100,则每个【多字元数组】包
含的十进制字元个数等于(100-1)中的10进制字元个数,即99中10进
制字元的个数,即2
-----------------------------------------------------------------------
令预定义变数obase的值是101(十进制),即採用101进制格式输出
输入102(十进制),输出 001 001
1)【多字元数字】001和001,并间用空格分割
2)001和001都是十进制格式,并且左补0以满足【多字元数字】位数的要求
3)预定义变数obase转换为十进制后的值是101,则每个【多字元数组】包含的十
-----------------------------------------------------------------------
令预定义变数obase的值是101(十进制),即採用101进制格式输出
输入102(十进制),输出 001 001
1)【多字元数字】001和001,并间用空格分割
2)001和001都是十进制格式,并且左补0以满足【多字元数字】位数的要求
3)预定义变数obase转换为十进制后的值是101,则每个【多字元数组】包含的十
进制字元个数等于(101-1)中的10进制字元个数,即100中10进制字元的个数,
即3
-------------------------------------------------------------------------------------------
last 保存最后显示数值的值
1)当在终端显示一个值时会产生副作用:将显示的值赋值给特殊变数last
2)last变数的short hand notation是小数点(单独使用,不和数值一起使用)
》POSIX标準没有last保留变数
-------------------------------------------------------------------------------------------
last 保存最后显示数值的值
1)当在终端显示一个值时会产生副作用:将显示的值赋值给特殊变数last
2)last变数的short hand notation是小数点(单独使用,不和数值一起使用)
》POSIX标準没有last保留变数
运算符/表达式
运算符号
---------------------------------------------------------------------------------------------------
符号 含义 结合性 优先权
---------------------------------------------------------------------------------------------------
++,--自增/自减无 C-10
---------------------------------------------------------------------------------------------------
- 负 无 C-9
---------------------------------------------------------------------------------------------------
^ 指 右 C-8
---------------------------------------------------------------------------------------------------
*,/,%乘/除/'余'左 C-7
---------------------------------------------------------------------------------------------------
+,- 加/减 左 C-6
---------------------------------------------------------------------------------------------------
=等 赋值家族 右 C-5
---------------------------------------------------------------------------------------------------
<,<=,>,>=,==,!= 关係操作符左 C-4
---------------------------------------------------------------------------------------------------
! 逻辑非 无 C-3
---------------------------------------------------------------------------------------------------
&& 逻辑与 左 C-2
---------------------------------------------------------------------------------------------------
|| 逻辑或 左 C-1
---------------------------------------------------------------------------------------------------
》POSIX标準中不包含逻辑操作符号 || && !
---------------------------------------------------------------------------------------------------
符号 含义 结合性 优先权
---------------------------------------------------------------------------------------------------
++,--自增/自减无 C-10
---------------------------------------------------------------------------------------------------
- 负 无 C-9
---------------------------------------------------------------------------------------------------
^ 指 右 C-8
---------------------------------------------------------------------------------------------------
*,/,%乘/除/'余'左 C-7
---------------------------------------------------------------------------------------------------
+,- 加/减 左 C-6
---------------------------------------------------------------------------------------------------
=等 赋值家族 右 C-5
---------------------------------------------------------------------------------------------------
<,<=,>,>=,==,!= 关係操作符左 C-4
---------------------------------------------------------------------------------------------------
! 逻辑非 无 C-3
---------------------------------------------------------------------------------------------------
&& 逻辑与 左 C-2
---------------------------------------------------------------------------------------------------
|| 逻辑或 左 C-1
---------------------------------------------------------------------------------------------------
》POSIX标準中不包含逻辑操作符号 || && !
表达式
1)expr代表一个完整表达式,var代表一个简单变数name 或 一个数组变数name[expr]
2)一般而言,表达式值的scale属性值等于表达式中相关数据的最大的scale值,其它情况会指明
3)常量是一种最简单的表达式
bc开始执行时将所有的常量(函式内的常量暂不处理)当作ibase进制的数据,并将其转换为
1)expr代表一个完整表达式,var代表一个简单变数name 或 一个数组变数name[expr]
2)一般而言,表达式值的scale属性值等于表达式中相关数据的最大的scale值,其它情况会指明
3)常量是一种最简单的表达式
bc开始执行时将所有的常量(函式内的常量暂不处理)当作ibase进制的数据,并将其转换为
内部使用的数据格式
4)表达式结果的【scale】属性
每个表达式都有一个【scale】属性,它来自于运算元的【scale】属性,运算符规则,预定义变数scale
---------------------------------------------------------------------------------------------------
算术运算表达式
---------------------------------------------------------------------------------------------------
表达式 表达式值
---------------------------------------------------------------------------------------------------
-expr expr表达式值的负数
---------------------------------------------------------------------------------------------------
+varvar+1(同C前缀自增操作符,先加1,后引用)
---------------------------------------------------------------------------------------------------
--var var-1(同C前缀自减操作符,先减1,后引用)
---------------------------------------------------------------------------------------------------
var++ var (同C后缀自增操作符,先引用,后加1)
---------------------------------------------------------------------------------------------------
var-- var (同C后缀自减操作符,先引用,后减1)
---------------------------------------------------------------------------------------------------
expr+expr 二者和
---------------------------------------------------------------------------------------------------
expr-expr 二者差
---------------------------------------------------------------------------------------------------
expr*expr 二者乘积
---------------------------------------------------------------------------------------------------
expr/expr 二者商,表达式值的scale属性由特殊变数scale决定
---------------------------------------------------------------------------------------------------
expr%expr "取模",计算方式如下所述
计算公式:a%b 等于 a - (a/b)*b
1)先计算a/b的商,结果的scale属性由特殊变数scale决定
2)取【特殊变数scale和scale(b)的和】和scale(a)中较大的,记做max-scale
3)计算 a - (a/b)*b,结果的scale属性由max-scale决定
》如果特殊变数scale的值是0,并且a,b运算元均是整数,则a%b是普通取模运算
---------------------------------------------------------------------------------------------------
expr^expr 第1个是低数,第2个是指数
1)第2个运算元必须是整数,否则产生warning,并'趋零截断'后获得一个整数
2)如果指数是负数,则表达式值的scale属性由特殊变数scale决定
3)如果指数是正数,scale(a^b)=min(scale(a)*b, max(特殊变数scale, scale(a)))
4)expr^0的值总是1
---------------------------------------------------------------------------------------------------
(expr) 提高expr的优先权
---------------------------------------------------------------------------------------------------
var=expr 将expr的值赋值给var
---------------------------------------------------------------------------------------------------
var<op>=expr 等同于var = var <op> expr表达式(自赋值)
简单变数的var
数组的var
---------------------------------------------------------------------------------------------------
逻辑表达式
---------------------------------------------------------------------------------------------------
1) 关係表达式的值始终是0(假)或1(真)
2) POSIX标準中关係表达式只能用在if(expr),while(expr),for(;expr;)的expr部分
---------------------------------------------------------------------------------------------------
expr1 < expr2 expr1 > expr2 expr1 == expr2
expr1 <= expr2 expr1 >= expr2 expr1 != expr2
---------------------------------------------------------------------------------------------------
3) 布尔关係
》布尔表达式的结果是0(假)或1(真)
》POSIX标準中没有布尔运算符
---------------------------------------------------------------------------------------------------
!expr(逻辑非) expr && expr(逻辑与) expr || expr(逻辑或)
4)表达式结果的【scale】属性
每个表达式都有一个【scale】属性,它来自于运算元的【scale】属性,运算符规则,预定义变数scale
---------------------------------------------------------------------------------------------------
算术运算表达式
---------------------------------------------------------------------------------------------------
表达式 表达式值
---------------------------------------------------------------------------------------------------
-expr expr表达式值的负数
---------------------------------------------------------------------------------------------------
+varvar+1(同C前缀自增操作符,先加1,后引用)
---------------------------------------------------------------------------------------------------
--var var-1(同C前缀自减操作符,先减1,后引用)
---------------------------------------------------------------------------------------------------
var++ var (同C后缀自增操作符,先引用,后加1)
---------------------------------------------------------------------------------------------------
var-- var (同C后缀自减操作符,先引用,后减1)
---------------------------------------------------------------------------------------------------
expr+expr 二者和
---------------------------------------------------------------------------------------------------
expr-expr 二者差
---------------------------------------------------------------------------------------------------
expr*expr 二者乘积
---------------------------------------------------------------------------------------------------
expr/expr 二者商,表达式值的scale属性由特殊变数scale决定
---------------------------------------------------------------------------------------------------
expr%expr "取模",计算方式如下所述
计算公式:a%b 等于 a - (a/b)*b
1)先计算a/b的商,结果的scale属性由特殊变数scale决定
2)取【特殊变数scale和scale(b)的和】和scale(a)中较大的,记做max-scale
3)计算 a - (a/b)*b,结果的scale属性由max-scale决定
》如果特殊变数scale的值是0,并且a,b运算元均是整数,则a%b是普通取模运算
---------------------------------------------------------------------------------------------------
expr^expr 第1个是低数,第2个是指数
1)第2个运算元必须是整数,否则产生warning,并'趋零截断'后获得一个整数
2)如果指数是负数,则表达式值的scale属性由特殊变数scale决定
3)如果指数是正数,scale(a^b)=min(scale(a)*b, max(特殊变数scale, scale(a)))
4)expr^0的值总是1
---------------------------------------------------------------------------------------------------
(expr) 提高expr的优先权
---------------------------------------------------------------------------------------------------
var=expr 将expr的值赋值给var
---------------------------------------------------------------------------------------------------
var<op>=expr 等同于var = var <op> expr表达式(自赋值)
简单变数的var
数组的var
---------------------------------------------------------------------------------------------------
逻辑表达式
---------------------------------------------------------------------------------------------------
1) 关係表达式的值始终是0(假)或1(真)
2) POSIX标準中关係表达式只能用在if(expr),while(expr),for(;expr;)的expr部分
---------------------------------------------------------------------------------------------------
expr1 < expr2 expr1 > expr2 expr1 == expr2
expr1 <= expr2 expr1 >= expr2 expr1 != expr2
---------------------------------------------------------------------------------------------------
3) 布尔关係
》布尔表达式的结果是0(假)或1(真)
》POSIX标準中没有布尔运算符
---------------------------------------------------------------------------------------------------
!expr(逻辑非) expr && expr(逻辑与) expr || expr(逻辑或)
=========================================================
注释
1) 多行注释标记(同C语言一样)是 /*...*/
可以把注释放在任何地方(变数名中间除外),注释被视为一个space
---------------------------------------------------------------------------------------------------
2) 单行注释标记是 #...
表示行结束的符号不是注释的一部分,会被正常处理
1) 多行注释标记(同C语言一样)是 /*...*/
可以把注释放在任何地方(变数名中间除外),注释被视为一个space
---------------------------------------------------------------------------------------------------
2) 单行注释标记是 #...
表示行结束的符号不是注释的一部分,会被正常处理
语句
1) 分号 和 换行符号newline 完整语句标识号,标识了一条可被bc执行的完整语句
\newline字元组合,则取消newline的完整语句标识号作用,此时bc将这个newline看作是spcace
2) 表达式/语句按顺序依次执行
---------------------------------------------------------------------------------------------------
语句 含义
-----------------------------------------------------------------------------------------------
expr 1) 当expr是"var[<op>]= expression" ,即是赋值语句时:仅完成赋值功能
2) 当expr不是赋值语句,则计算expr的值并显示
1)使用obase进制显示最终的计算结果
2)显示数值后再自动显示newline,即显示完毕后游标自动换到下一行行首
-----------------------------------------------------------------------------------------------
string 终端显示字元串string(不显示字元串开始,结束标记)
1) 字元串string开始标记" 结束标记",二者间的所有字元都被当作字元串中的字元
2) 显示字元串string后不会自动显示newline,即显示完毕后游标不移动
》POSIX标準:字元串中可以包含全部的基本ASCII的字元
》本版本bc :字元串中不能包含NUL字元
-----------------------------------------------------------------------------------------------
print list 依次输出显示list列表中的值
1) list是string和expr组成的列表,用逗号分割
2) 依次显示list中的每个string,expr的值(显示完毕后不自动换行)
3) 先计算expr的值,后显示计算得到的结果(显示后将其赋值给预定义变数last)
4) print显示的字元串可以包如下含转义序列:
\a表示振铃 \b表示退格 \f表示走纸 \n表示换行
\r表示回车 \q表示"符号 \t表示水平制表 \\表示\符号
其它任何转义字元组合都会被忽略(非合法组合会被直接删除)
》POSIX标準:不包含print语句
-----------------------------------------------------------------------------------------------
{statement-list} 组合语句,逻辑上相当于一条语句
-----------------------------------------------------------------------------------------------
if(expr) statemet-1 POSIX标準
if(expr) statemet-1 else statement-2 非POSIX标準
如果expr的值非0,则执行statement-1,否则执行statement-2
-----------------------------------------------------------------------------------------------
while(expr) statement
如果expr的值非0,则执行statement,否则终止循环(break亦可用于终止循环)
-----------------------------------------------------------------------------------------------
for([expr-1];[expr-2];[expr-3]) statement
expr-1,expr-2,expr-3均可省略,expr-2省略时表示条件一直为真
》POSIX标準要求三个表达式均不可省略
-----------------------------------------------------------------------------------------------
break结束(一层)while/for循环
-----------------------------------------------------------------------------------------------
continue 开始(一层)下一次while/for
-----------------------------------------------------------------------------------------------
halt执行时,退出bc(非POSIX)
-----------------------------------------------------------------------
\newline字元组合,则取消newline的完整语句标识号作用,此时bc将这个newline看作是spcace
2) 表达式/语句按顺序依次执行
---------------------------------------------------------------------------------------------------
语句 含义
-----------------------------------------------------------------------------------------------
expr 1) 当expr是"var[<op>]= expression" ,即是赋值语句时:仅完成赋值功能
2) 当expr不是赋值语句,则计算expr的值并显示
1)使用obase进制显示最终的计算结果
2)显示数值后再自动显示newline,即显示完毕后游标自动换到下一行行首
-----------------------------------------------------------------------------------------------
string 终端显示字元串string(不显示字元串开始,结束标记)
1) 字元串string开始标记" 结束标记",二者间的所有字元都被当作字元串中的字元
2) 显示字元串string后不会自动显示newline,即显示完毕后游标不移动
》POSIX标準:字元串中可以包含全部的基本ASCII的字元
》本版本bc :字元串中不能包含NUL字元
-----------------------------------------------------------------------------------------------
print list 依次输出显示list列表中的值
1) list是string和expr组成的列表,用逗号分割
2) 依次显示list中的每个string,expr的值(显示完毕后不自动换行)
3) 先计算expr的值,后显示计算得到的结果(显示后将其赋值给预定义变数last)
4) print显示的字元串可以包如下含转义序列:
\a表示振铃 \b表示退格 \f表示走纸 \n表示换行
\r表示回车 \q表示"符号 \t表示水平制表 \\表示\符号
其它任何转义字元组合都会被忽略(非合法组合会被直接删除)
》POSIX标準:不包含print语句
-----------------------------------------------------------------------------------------------
{statement-list} 组合语句,逻辑上相当于一条语句
-----------------------------------------------------------------------------------------------
if(expr) statemet-1 POSIX标準
if(expr) statemet-1 else statement-2 非POSIX标準
如果expr的值非0,则执行statement-1,否则执行statement-2
-----------------------------------------------------------------------------------------------
while(expr) statement
如果expr的值非0,则执行statement,否则终止循环(break亦可用于终止循环)
-----------------------------------------------------------------------------------------------
for([expr-1];[expr-2];[expr-3]) statement
expr-1,expr-2,expr-3均可省略,expr-2省略时表示条件一直为真
》POSIX标準要求三个表达式均不可省略
-----------------------------------------------------------------------------------------------
break结束(一层)while/for循环
-----------------------------------------------------------------------------------------------
continue 开始(一层)下一次while/for
-----------------------------------------------------------------------------------------------
halt执行时,退出bc(非POSIX)
-----------------------------------------------------------------------
示例
$a=0 $a=0
$if(a) halt $if(a) quit
由于a为0假,所以halt未执行,bc没有退出 quit命令在'编译'时就被执行,bc退出
-----------------------------------------------------------------------------------------------
return从函式返回0
return(expr) 从函式返回expr的值
return expr 从函式返回expr的值
》POSIX标準要求expr必须放在圆括弧中,即return(expr)
$a=0 $a=0
$if(a) halt $if(a) quit
由于a为0假,所以halt未执行,bc没有退出 quit命令在'编译'时就被执行,bc退出
-----------------------------------------------------------------------------------------------
return从函式返回0
return(expr) 从函式返回expr的值
return expr 从函式返回expr的值
》POSIX标準要求expr必须放在圆括弧中,即return(expr)
伪语句
==============================================
非传统上的可执行语句,它们在'编译'时执行
-----------------------------------------------------------------------------------------------
limits 显示本机bc程式的'限制'信息(非POSIX)
-----------------------------------------------------------------------------------------------
quit 出现,即退出bc
-----------------------------------------------------------------------------------
$a=0 $a=0
$if(a) halt $if(a) quit
由于a为0假,所以halt未执行,bc没有退出 quit命令在'编译'时就被执行,bc退出
-----------------------------------------------------------------------------------------------
warranty 显示完整格式的bc软体信息(非POSIX)
-----------------------------------------------------------------------------------------------
limits 显示本机bc程式的'限制'信息(非POSIX)
-----------------------------------------------------------------------------------------------
quit 出现,即退出bc
-----------------------------------------------------------------------------------
$a=0 $a=0
$if(a) halt $if(a) quit
由于a为0假,所以halt未执行,bc没有退出 quit命令在'编译'时就被执行,bc退出
-----------------------------------------------------------------------------------------------
warranty 显示完整格式的bc软体信息(非POSIX)
函式
1) 每个函式都有一个返回值,函式的形参可以是0个或多个
2) 函式是'动态'的,即
1)函式未定义之前,函式不可被调用
2)函式定义之后,函式可以被调用
3)函式定义之后,如果再次定义同名函式,则新定义覆盖旧定义
3) 函式中ibase的用法
1) 函式调用开始时,函式内所有的常量就被当作ibase进制处理
2) 函式执行期间ibase值的改变对函式常量不起作用
3) 标準read()函式一直使用ibase的值处理输入数据
---------------------------------------------------------------------------------------------------
1) 预定义函式
---------------------------------------------------------------------------------------------------
函式调用含义 函式返回值
---------------------------------------------------------------------------------------------------
length(expr) 求expr值的length属性 expr值的length属性
---------------------------------------------------------------------------------------------------
scale(expr) 求expr值的scale属性 expr值的scale属性
---------------------------------------------------------------------------------------------------
read()从标準输入读取一个值(该值是ibase进制) 读取的'值'
---------------------------------------------------------------------------------------------------
sqrt(expr) 求expr的平方根(expr是负数时产生错误) expr的平方根
---------------------------------------------------------------------------------------------------
》POSIX标準中不包含read()预定义函式
---------------------------------------------------------------------------------------------------
2) 自定义函式
---------------------------------------------------------------------------------------------------
1) 定义语法
define是关键字;name是函式名;auto-list自动变数列表;parameters形参
POSIX标準
函式体开始的大括弧必须和define关键字在同一行;其它部分必须紧随define所在行
define name(parameters){newline
[auto-list] statement-list}
扩展标準
允许函式体开始大括弧前/后可以出现0或多个空行
define name(parameters)
{[auto-list] statement-list}
---------------------------------------------------------------------------------------------------
1) 函式名
函式命名方法同简单变数,数组变数的命名规则相同
---------------------------------------------------------------------------------------------------
2) 形参(parameters)
1) 函式定义中形参的个数可以是0个或多个(通过逗号分割)
2) 形参可以是简单变数或数组变数(非POSIX),定义数组形参时使用name[]标记
---------------------------------------------------------------------------------------------------
3) auto-list是可选的变数列表,仅限于函式内使用
定义语法
auto name,...;
1)auto关键字,name变数名,逗号分割变数,末尾分号结束语句(可选)
2)name是简单变数,name[expr]是数组变数
1) 同名覆盖和恢复
1) 函式执行前,将外部的同名变数逐个压栈,然后初始化为0
2) 函式执行结束后,同名的外部变数的值出栈恢复
2) '真正'自动变数
1) 真正的自动变数的初化的值
3) bc中自动变数和C中局部变数的区别
bc:如果函式A调用函式B,那幺B可以通过变数名直接使用函式A中定义的
2) 函式是'动态'的,即
1)函式未定义之前,函式不可被调用
2)函式定义之后,函式可以被调用
3)函式定义之后,如果再次定义同名函式,则新定义覆盖旧定义
3) 函式中ibase的用法
1) 函式调用开始时,函式内所有的常量就被当作ibase进制处理
2) 函式执行期间ibase值的改变对函式常量不起作用
3) 标準read()函式一直使用ibase的值处理输入数据
---------------------------------------------------------------------------------------------------
1) 预定义函式
---------------------------------------------------------------------------------------------------
函式调用含义 函式返回值
---------------------------------------------------------------------------------------------------
length(expr) 求expr值的length属性 expr值的length属性
---------------------------------------------------------------------------------------------------
scale(expr) 求expr值的scale属性 expr值的scale属性
---------------------------------------------------------------------------------------------------
read()从标準输入读取一个值(该值是ibase进制) 读取的'值'
---------------------------------------------------------------------------------------------------
sqrt(expr) 求expr的平方根(expr是负数时产生错误) expr的平方根
---------------------------------------------------------------------------------------------------
》POSIX标準中不包含read()预定义函式
---------------------------------------------------------------------------------------------------
2) 自定义函式
---------------------------------------------------------------------------------------------------
1) 定义语法
define是关键字;name是函式名;auto-list自动变数列表;parameters形参
POSIX标準
函式体开始的大括弧必须和define关键字在同一行;其它部分必须紧随define所在行
define name(parameters){newline
[auto-list] statement-list}
扩展标準
允许函式体开始大括弧前/后可以出现0或多个空行
define name(parameters)
{[auto-list] statement-list}
---------------------------------------------------------------------------------------------------
1) 函式名
函式命名方法同简单变数,数组变数的命名规则相同
---------------------------------------------------------------------------------------------------
2) 形参(parameters)
1) 函式定义中形参的个数可以是0个或多个(通过逗号分割)
2) 形参可以是简单变数或数组变数(非POSIX),定义数组形参时使用name[]标记
---------------------------------------------------------------------------------------------------
3) auto-list是可选的变数列表,仅限于函式内使用
定义语法
auto name,...;
1)auto关键字,name变数名,逗号分割变数,末尾分号结束语句(可选)
2)name是简单变数,name[expr]是数组变数
1) 同名覆盖和恢复
1) 函式执行前,将外部的同名变数逐个压栈,然后初始化为0
2) 函式执行结束后,同名的外部变数的值出栈恢复
2) '真正'自动变数
1) 真正的自动变数的初化的值
3) bc中自动变数和C中局部变数的区别
bc:如果函式A调用函式B,那幺B可以通过变数名直接使用函式A中定义的
自动变数(同名覆盖除外)
C语言:局部变数的作用域仅限于定义它的代码块,不具备bc语言中自动变数的特性
4) bc支持函式的递归调用
---------------------------------------------------------------------------------------------------
4) 函式体和返回值
1)函式体由是bc的一系列语句构成(分号或newline标识出完整可执行语句)
2)函式结束
1) 有返回值的函式
1)每个函式的末尾都隐含了一个语句:return(0)
2)使用return语句指定函式执行结束后的返回值
2) 无返回值的函式
1)定义无返回值的函式只须'关键字组合'define void'代替关键字define
---------------------------------------------------------------------------------------------------
2) 自定义函式的调用
name(parameters)
1) 函式调用前先检查参数个数和参数类型是否和定义一致
》任何参数个数/参数类型上的不匹配都将产生错误
》对未定义函式的调用亦会产生错误
2) 按实参顺序依次将实参赋值给形参,即值传递
》对形参的更改不会影响实参的值
3) 数组调用
C语言:局部变数的作用域仅限于定义它的代码块,不具备bc语言中自动变数的特性
4) bc支持函式的递归调用
---------------------------------------------------------------------------------------------------
4) 函式体和返回值
1)函式体由是bc的一系列语句构成(分号或newline标识出完整可执行语句)
2)函式结束
1) 有返回值的函式
1)每个函式的末尾都隐含了一个语句:return(0)
2)使用return语句指定函式执行结束后的返回值
2) 无返回值的函式
1)定义无返回值的函式只须'关键字组合'define void'代替关键字define
---------------------------------------------------------------------------------------------------
2) 自定义函式的调用
name(parameters)
1) 函式调用前先检查参数个数和参数类型是否和定义一致
》任何参数个数/参数类型上的不匹配都将产生错误
》对未定义函式的调用亦会产生错误
2) 按实参顺序依次将实参赋值给形参,即值传递
》对形参的更改不会影响实参的值
3) 数组调用
==========================================================
标準函式馆
1)如果bc调用时使用了-l选项,则在bc执行任何指令之前会预先载入标準函式馆并且将特殊
1)如果bc调用时使用了-l选项,则在bc执行任何指令之前会预先载入标準函式馆并且将特殊
变数scale设定为20
2)在函式馆中的函式执行时,它使用它调用时预定义变数scale的值
-----------------------------------------------------------------------------------------------
s(x) 计算x的正玄值,x的单位是弧度,sin(x)
-----------------------------------------------------------------------------------------------
c(x) 计算x的余玄值,x的单位是弧度,cos(x)
-----------------------------------------------------------------------------------------------
a(x) 计算x的反正切值,x的单位是弧度,arctan(x)
-----------------------------------------------------------------------------------------------
l(x) 计算x的自然对数,ln(x)
-----------------------------------------------------------------------------------------------
e(x) 计算e的x次方,e^x
-----------------------------------------------------------------------------------------------
j(n,x) 计算x的n阶bessel函式(bessel专用语,用到时查看即可)
==========================================================
2)在函式馆中的函式执行时,它使用它调用时预定义变数scale的值
-----------------------------------------------------------------------------------------------
s(x) 计算x的正玄值,x的单位是弧度,sin(x)
-----------------------------------------------------------------------------------------------
c(x) 计算x的余玄值,x的单位是弧度,cos(x)
-----------------------------------------------------------------------------------------------
a(x) 计算x的反正切值,x的单位是弧度,arctan(x)
-----------------------------------------------------------------------------------------------
l(x) 计算x的自然对数,ln(x)
-----------------------------------------------------------------------------------------------
e(x) 计算e的x次方,e^x
-----------------------------------------------------------------------------------------------
j(n,x) 计算x的n阶bessel函式(bessel专用语,用到时查看即可)
==========================================================
Ubuntu 12.04 LTS版的bc(1.06.95)的LIMITS
-----------------------------------------------------------------------------------------------
BC_BASE_MAX obase的最大值被设为999,ibase的最大值被设为16
-----------------------------------------------------------------------------------------------
BC_DIM_MAX 任意精度的最大值被设为65535
-----------------------------------------------------------------------------------------------
BC_SCALE_MAX 小数点后数字字元的最大个数是INT_MAX
-----------------------------------------------------------------------------------------------
BC_BASE_MAX obase的最大值被设为999,ibase的最大值被设为16
-----------------------------------------------------------------------------------------------
BC_DIM_MAX 任意精度的最大值被设为65535
-----------------------------------------------------------------------------------------------
BC_SCALE_MAX 小数点后数字字元的最大个数是INT_MAX
小数点前数字字元的最大个数是INT_MAX
-----------------------------------------------------------------------------------------------
BC_STRING_MAX 字元串中包含的最大的字元的个数是INT_MAX
-----------------------------------------------------------------------------------------------
exponent 在^运算中指数的最大值是LONG_MAX
-----------------------------------------------------------------------------------------------
variable names 简单变数,数组变数,函式名中最多包含的字元个数是32767
-----------------------------------------------------------------------------------------------
BC_STRING_MAX 字元串中包含的最大的字元的个数是INT_MAX
-----------------------------------------------------------------------------------------------
exponent 在^运算中指数的最大值是LONG_MAX
-----------------------------------------------------------------------------------------------
variable names 简单变数,数组变数,函式名中最多包含的字元个数是32767
=======================================================
环境变数
》bc识别并处理以下环境变数
-----------------------------------------------------------------------------------------------
POSIXLY_CORRECT 该环境变数同-s选项
-----------------------------------------------------------------------------------------------
BC_ENV_ARGS bc获得参数的另一种方法
1)环境变数的值的格式同bc命令行中直接使用参数的格式
2)环境变数中提供的参数会先于命令行中提供的参数而执行
BC_ENV_ARGS套用建议:
通过它在每次调用bc时载入常用的函式定义,变数定义,数组定义
-----------------------------------------------------------------------------------------------
BC_LINE_LENGTH 指定bc输出的每行中最多包含的字元个数(包括\和newline字元)
1)这个环境变数的值是一个整数
2)值是0时表示取消'多行显示特性'
3)设定的值小于3时,自动将它的值设定为70
》bc识别并处理以下环境变数
-----------------------------------------------------------------------------------------------
POSIXLY_CORRECT 该环境变数同-s选项
-----------------------------------------------------------------------------------------------
BC_ENV_ARGS bc获得参数的另一种方法
1)环境变数的值的格式同bc命令行中直接使用参数的格式
2)环境变数中提供的参数会先于命令行中提供的参数而执行
BC_ENV_ARGS套用建议:
通过它在每次调用bc时载入常用的函式定义,变数定义,数组定义
-----------------------------------------------------------------------------------------------
BC_LINE_LENGTH 指定bc输出的每行中最多包含的字元个数(包括\和newline字元)
1)这个环境变数的值是一个整数
2)值是0时表示取消'多行显示特性'
3)设定的值小于3时,自动将它的值设定为70