語法
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
相關檔案
/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)
---------------------------------------------------------------------------------------------------
數據/輸入/輸出
1)任意精度的數值(精度包括整數部分的精度和小數部分的精度)
常量數值中間不允許有space
---------------------------------------------------------------------------------------------------
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
默認值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】,
則每個【多字元數字】包含的10進制字元個數等於
(【OBASE10base】-1)中的10進制字元個數
例子
-----------------------------------------------------------------------
令預定義變數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,則每個【多字元數組】包含的十
進制字元個數等於(101-1)中的10進制字元個數,即100中10進制字元的個數,
即3
-------------------------------------------------------------------------------------------
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標準中不包含邏輯操作符號 || && !
表達式
1)expr代表一個完整表達式,var代表一個簡單變數name 或 一個數組變數name[expr]
2)一般而言,表達式值的scale屬性值等於表達式中相關數據的最大的scale值,其它情況會指明
3)常量是一種最簡單的表達式
bc開始執行時將所有的常量(函式內的常量暫不處理)當作ibase進制的數據,並將其轉換為
內部使用的數據格式
4)表達式結果的【scale】屬性
每個表達式都有一個【scale】屬性,它來自於運算元的【scale】屬性,運算符規則,預定義變數scale
---------------------------------------------------------------------------------------------------
算術運算表達式
---------------------------------------------------------------------------------------------------
表達式 表達式值
---------------------------------------------------------------------------------------------------
-expr expr表達式值的負數
---------------------------------------------------------------------------------------------------
+var var+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) 分號 和 換行符號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)
-----------------------------------------------------------------------
示例
$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)
函式
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中定義的
自動變數(同名覆蓋除外)
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執行任何指令之前會預先載入標準函式館並且將特殊
變數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專用語,用到時查看即可)
==========================================================
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
小數點前數字字元的最大個數是INT_MAX
-----------------------------------------------------------------------------------------------
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