BC与DC有何不同?


Answers:


34

dc是一个非常过时的工具,比bc。引用Wikipedia页面

它是最古老的Unix实用程序之一,甚至早于C编程语言的发明。像那个年代的其他实用程序一样,它具有强大的功能集,但语法极为简洁。

语法是反波兰符号,这基本上意味着参数(即数字)在运算符之后。dc用法的基本示例是:

echo '3 4 * p' | dc

p需要打印计算结果的位置。bc另一方面,使用更熟悉的后缀表示法,因此使用起来更直观。这是bc用法示例:

echo '3 * 4' | bc

使用哪一个?

bcPOSIX是POSIX标准化的,因此两者之间的可移植性可能更高(至少在现代系统上如此)。如果您正在做手动计算器工作,那么绝对是选择(除非您有点受虐狂)。dc仍然可以使用,在这种情况下,反向抛光符号很有用。假设您有一个程序可以输出要汇总的数字流,例如:

23
7
90
74
29

要做到这dc一点非常简单(至少在现代的实现中,每个运算符可以使用两个以上的数字),因为您只需要+p在流中追加a ,例如:

{ gen_nums; echo +p } | dc

但这bc更复杂,因为我们不仅需要+ 每个数字之间放置一个a 并确保所有内容都在同一行,而且还要确保在末尾有一个换行符:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

10
您已经使用来使gen_nums示例变得非常复杂bc。它可以简化为:gen_nums | paste -sd+ | bc
devnull 2014年

14
有趣的事实:传统上bc,这只是一个前端工具,bc可以将符号编译为的符号,dc并通过管道将其插入dc以获得结果。在FreeBSD上,仍然有一个-c标记bc,您可以使用该标记将其编译为dc符号. For example echo'3 * 4'| bc`等于echo '3 * 4' | bc -c | dc。参见linux.die.net/man/1/bcfreebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens

14
嗯,dc您在使用哪个?在Ubuntu 14.04和OS X上,+操作员始终在堆栈上使用正好两个值进行操作
Digital Trauma

2
正确的dc用法示例:gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'。该脚本用于dc循环读取和添加数字,然后打印结果。请参阅有关负数的注释
ruvim

1
@RaphaelAhrens有趣的是,在macOS上bc -c做了一些奇怪而又不同的事情(并且该-c标志未记录)。如果我尝试将其管道传输到dc,则会遇到一堆错误(并且没有管道传输的输出dc是非常神秘的@iK3:K4:*W@r\n@i)。
康拉德·鲁道夫

9

两者之间的基本区别是dc使用了相反的波兰语符号。它甚至需要显式命令才能产生输出。

您可以bc说两个整数:

bc <<< "2+4"

它会自己产生6一条线。但是,dc您需要说:

dc <<< "2 4 +p"

您也可以使用来做很多有趣的事情dc,例如,参考我在这里的答案进行制作

Hello World!

使用dc

dc <<<“ 8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P”


“公元前被写为直流的前端”
亚当

3

dc是一个计算器,而bc实际上是一种语言。请参阅他们的手册页。

直流电

dc是反向抛光台式计算器,支持无限精度运算。它还允许您定义和调用宏。通常,直流从标准输入读取数据;如果给定任何命令参数,则它们是文件名,并且dc在从标准输入读取之前读取并执行文件的内容。所有正常输出均为标准输出;所有错误输出均为标准错误。

公元前

bc是一种通过语句的交互式执行支持任意精度数字的语言。语法与C编程语言有一些相似之处。可通过命令行选项使用标准数学库。如果需要,则在处理任何文件之前定义数学库。bc首先以列出的顺序处理命令行中列出的所有文件中的代码。处理完所有文件后,bc从标准输入中读取。所有代码均在读取时执行。(如果文件包含暂停处理器的命令,则bc将永远不会从标准输入中读取。)

实际上,这取决于您最终想要做的数学运算。使用无法进行某些操作dc。这些年来,除了其他几个命令行计算器工具之外,我还使用了这两种工具。有关其他示例,请参见“ 命令行表达式求解器? ”。


3
@REACHUS-我不确定我是否理解您的要求?由于dc是反向抛光符号计算器,并且由于我一直使用HP反向抛光符号计算器,所以我实际上更喜欢使用它dcbc但是我想在需要执行复杂的数学计算的任何时候它们都仍在使用。我经常使用它们将数字b / w以10为基数转换为以16为基数和以2为基数。
slm

3
bc是一种语言,从某种意义上说它使dc人类变得友好,而不是更强大。如今,这些应用程序共享库,但是bc被称为一种语言dc一个计算器,因为它dc做到了数学和bc说数学dc这是旧man页面:开发了一种名为BC[1]的语言,该语言可以接受用高级语言编写的程序,并编译由DC解释的输出。下面描述的某些命令是为编译器界面设计的,人类用户不容易操作。
mikeserv

2
我声称dc也是一种语言。例如codegolf.stackexchange.com/a/47921/11259
Digital Trauma

1
@DigitalTrauma争论说这不是一种语言是荒谬的,因为它有一个词法分析器和解析器。但是,以该示例为例,认为它是人类可读的,将是荒谬的。我的意思是……该死。
Parthian Shot

1
@ParthianShot同意。我对“ dc是一个计算器,而bc是一种实际的语言”的理解是,slm暗示dc不是一种我不同意的语言。但是我可能只是在读错答案……
数字创伤2015年

0

以我的拙见,用最少的话来说,GNU dc与GNU bc在3个方面有所不同:

1)如果不考虑BC的数学库,则在进行初等算术时应尽可能地节省击键次数(用JanŁukasiewicz的话:无括号的表示法),以便将更多的精力集中在要点上并避免分散注意力。

2)在Microsoft Windows 7的命令行中,GNU dc比GNU bc消耗的内存(〜320K)少(〜320K)。

3)GNU dc中的粒度控制比GNU bc中的粒度控制要多得多,例如,GNU bc中没有堆栈和寄存器命令。

两者的1.07.1 win32版本位于https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.