Linux内的bc计算器是一个非常强大的计算器,内置了一套类似C语言的语法。学习bc可以不用高级编程语言的情况下解决一系列的问题。但是目前网上没有找到很好的中文教程,在此自己写一个,方便以后查阅。
基本使用
最基本的是日常使用的计算,这样子和Windows自带的计算器没有太大的差别,不过一目了然的输入和运算优先级的支持还是要强大很多。具体方法如下:
bc
1+2*3-5*2
-3
注:上述示例意为输入bc后启动,输入1+2*3-5*2
后按回车,得到结果-3
内置变量
但是在输入5/4
的时候,会得到1。这是因为bc有若干内置变量,其中的scale
内置变量指定运算要用到的小数点后的位数,默认为0,即只支持指定运算。因此,在运算前设置scale=2
,就会得到正确的结果啦!^_^
总共有4个内置变量,为:
变量名称 | 作用 |
---|---|
scale | 指定运算要用到的小数点后的位数 |
ibase | 指定输入的进制数 |
obase | 指定输出的进制数 |
last或者. | 最近打印的数字(扩展) |
使用内置变量进行进制转换
指定输入输出进制的情况下就能轻松处理进制转换了!比如二进制转16进制:
ibase=2
obase=16
1010
101
这是怎么回事?不是应该是A吗?原因在于:先指定了二进制的输入,在指定obase变量的时候,16也被认为是二进制的输入啦!在二进制的输入情况下,所有的非0全部认为是1,于是16被看作是11,即3进制。1010对应十进制是10,101对于的3进制也是10。就是这样啦。
正确的方法应该是先指定obase,如下:
obase=16
ibase=2
1010
A
变量
bc可以支持用户自定义变量。变量有2种类型,数字和数组。注意,不支持字符串类型的变量,数组也只能是数字的数组。至于变量的赋值,和C语言语法一致:
var_name = 123;
array_name[13] = 2;
在以上的例子中,声明了一个var_name的变量,赋值为123。声明了一个名为array_name的数组,它的0到12号元素均为0,13号元素为2。注意,分号可有可无,但是如果是写脚本程序的话,写上为好。
所有的变量在未赋值时均为0。
如果在变量前面加入auto,则表明是局部变量,否则为全局变量。(函数的参数为局部变量,是例外情况)
运算以及内置函数
bc支持以下几种运算:
运算符 | 解释 |
---|---|
++,– | 同C语言,也分前置和后置 |
+,-,*,/ | 同C语言 |
+=,-=,*=,/= | 同C语言 |
%,%= | 取余。当scale=0时同C语言,否则见下 |
^ | 指数运算(只支持整数的指数) |
<,<=,>,>=,==,!= | 同C语言 |
!, &&, || | 同C语言 |
注意取余运算,当scale不为0时,如,scale=2,则:
4 % 3 = 0.01
这是由于4/3=1.33,4-3*1.33=0.01
另外,bc还有4个内置函数,分别是:
名称 | 作用 |
---|---|
length | 得到一个变量的有效数字个数 |
read | 得到用户输入 |
scale | 不同于内置变量,这个内置函数意为得到变量小数点后的数字的个数 |
sqrt | 开方运算 |
具体示例参见后面的程序。
语言语法
主要的语法完全可以参照C语言。注意的是:当一个值没有被赋予变量时,会直接输出,因此可以通过直接输入字符串的方式得到输出。字符串以""
包裹。
关键字
有以下的关键字:
关键字 | 作用 |
---|---|
输出变量,后面是一个列表,以, 分隔,会将其依次输出,注意,不会输出换行符,需要自己添加”\n”。关于转义字符,和C语言相同。 |
|
{} | 大括号构成语言块,作用和C语言相同 |
if,else | 用法和C语言相同 |
for | 和C语言相同 |
break | 和C语言相同 |
continue | 和C语言相同 |
while | 和C语言相同 |
return | 和C语言相同 |
halt | 当运行到此语句时,程序退出 |
函数
函数的声明方法: