bcはdcとどう違うのですか?


回答:


34

dcは非常に古風なツールであり、やや古いですbcウィキペディアのページを引用するには:

これは最も古いUnixユーティリティの1つであり、Cプログラミング言語の発明よりも前のものです。そのビンテージの他のユーティリティと同様に、強力な機能セットを備えていますが、構文は非常に簡潔です。

構文は逆ポーランド記法です。これは基本的に、引数(つまり数値)が最初に来て、その後に演算子が続くことを意味します。基本的なdc使用例は次のとおりです。

echo '3 4 * p' | dc

どこp計算の結果を印刷するために必要です。bc一方、より馴染みのある中置表記法を使用しているため、より直感的に使用できます。以下にbc使用例を示します。

echo '3 * 4' | bc

どちらを使用するのですか?

bcPOSIXによって標準化されているので、おそらく2つのうちのよりポータブルなものです(少なくとも最新のシステムでは)。あなたが手動の電卓の仕事をしているなら、それは間違いなく選択です(あなたがいくぶんマゾヒストでない限り)。dcただし、ここでも使用できます。逆ポーランド記法が便利な場合を次に示します。合計したい数値のストリームを出力するプログラムがあるとします。例えば:

23
7
90
74
29

ストリームにdca +pを追加するだけでよいので、これを行うのは非常に簡単です(少なくとも、各演算子が2つ以上の数値を取ることができる最新の実装では)。

{ gen_nums; echo +p } | dc

しかし、各番号の間にすべてbcを入れて、すべてが同じ行にあることを確認するだけでなく、最後に改行があることも確認する必要があるため、より複雑になります。+

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

10
あなたはgen_nums例を使用して恐ろしく複雑な例を変えましたbc。次のように簡略化できます。gen_nums | paste -sd+ | bc
devnull 14

14
おもしろい事実:伝統的にbcは、bc表記法を表記法にコンパイルし、dcそれをパイプ処理しdcて結果を得るフロントエンドツールにすぎませんでした。FreeBSDには、まだエコー '3 * 4' 表記にコンパイルできる-cフラグbcがあります| bc`はに等しい。linux.die.net/man/1/bcおよびfreebsd.org/cgi/man.cgi?query=bc&sektion=1を参照してくださいdc. For example echo '3 * 4' | bc -c | dc
Raphael Ahrens

14
うーん、どちらdcを使用していますか?Ubuntu 14.04およびOS Xでは、+オペレーターは常にスタックから2つの値を操作します
Digital Trauma

2
正しいdc使用例:gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'。このスクリプトはdc、ループで数値を1つずつ読み取り、追加し、結果を出力します。負の数に関する注意を参照してください
-ruvim

1
@RaphaelAhrens興味深いことに、macOS bc -cでは奇妙で異なることを行います(-cフラグは文書化されていません)。にパイプしようとするとdc、大量のエラーが発生します(パイプなしの出力dcは非常に不可解です@iK3:K4:*W@r\n@i)。
コンラッドルドルフ

9

2つの基本的な違いdcは、逆ポーランド記法を使用することです。出力を生成するためにも、明示的なコマンドが必要です。

次のようにbc言うと、2つの整数を追加できます。

bc <<< "2+4"

そして、それは6それ自体で線上に生成します。ただし、dc次のように言う必要があります。

dc <<< "2 4 +p"

また、使用して非常に楽しいものを行うことができますdc例えば、私の答えを参照して、ここで生成するための

Hello World!

を使用しdcます。

dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"


「BcはDcのフロントエンドとして書かれた」
アダム14

3

dcは計算機bcですが、実際の言語です。それらのマニュアルページを参照してください。

dc

dcは、無制限の精度計算をサポートする逆ポーランド卓上計算機です。また、マクロを定義して呼び出すこともできます。通常、dcは標準入力から読み取ります。コマンド引数が指定されている場合、それらはファイル名であり、dcは標準入力から読み取る前にファイルの内容を読み取って実行します。通常の出力はすべて標準出力になります。すべてのエラー出力は標準エラーになります。

紀元前

bcは、ステートメントの対話型実行で任意の精度の数値をサポートする言語です。構文にはCプログラミング言語との類似点がいくつかあります。標準の数学ライブラリは、コマンドラインオプションで利用できます。要求された場合、数学ライブラリはファイルを処理する前に定義されます。bcは、コマンド行にリストされているすべてのファイルのコードをリストされている順序で処理することから始まります。すべてのファイルが処理された後、bcは標準入力から読み取ります。すべてのコードは読み取られたとおりに実行されます。(ファイルにプロセッサを停止するコマンドが含まれている場合、bcは標準入力から読み取りません。)

最終的に数学的に何をしたいのかに依存します。を使用して操作できない場合がありますdc。私は他のいくつかのコマンドライン計算ツールに加えて、長年にわたって両方を使用しました。追加の例については、「コマンドライン式ソルバー」を参照してください。


3
@REACHUS-あなたが何を求めているのか理解できませんか?以下のためにdc逆ポーランド記法電卓であることと、私はいつもHPを使用したので、私が実際に使用して好むポーランド記法電卓逆dcにするbcが、私は、彼らはあなたが複雑な数学的計算を実行する必要がまだ使用、いつでも両方だと言うでしょう。多くの場合、これらを使用して10進数の基数10から16および2を基数に変換しますが、AWKスクリプト内からも表形式データの列を集計するために使用しました。
slm

3
bcそれは、それが人間に優しいという意味での言語であり、dcそれがより強力であったということではありません。最近では、アプリケーションはLIBSを共有するが、bc呼ばれた言語計算をするので、数学を行なったし、数学を話した-に。古いページは次のとおりです。高レベル言語で記述されたプログラムを受け入れ、DCによって解釈される出力をコンパイルする[1] と呼ばれる言語が開発されました。以下で説明するコマンドの一部は、コンパイラインターフェイス用に設計されており、人間のユーザーが操作するのは簡単ではありません。dcdcbcdcmanBC
mikeserv

2
dcも言語だと主張しています。例codegolf.stackexchange.com/a/47921/11259
デジタルトラウマ

1
@DigitalTraumaこれは言語ではないと主張するのは、レクサーとパーサーを備えているため、ばかげているでしょう。しかし、その例を考えると、それは人間が読むことができると主張するのはばかげているでしょう。つまり...いまいましい。
パルティアショット

1
@ParthianShot同意しました。「dcは計算機ですが、bcは実際の言語です」という読み方は、slmがdcが言語ではないことを暗示しているということです。しかし、私はちょうど...解答が間違っに読んだことがあります
デジタルトラウマ

0

私の謙虚な意見と可能な限り少ない言葉で、GNU dcはGNU bcと3つの点で異なります。

1)bcの数学ライブラリが気に入らない場合、初等算術を行う際にできるだけ多くのキーストローク(1月Janukasiewiczの言葉:括弧なし表記)を保存し、本質に集中し、注意散漫を避ける。

2)Microsoft Windows 7のコマンドラインでは、GNU dcが消費するメモリ(〜320K)はGNU bc(〜360K)よりも少なくなります。

3)GNU bcよりもGNU dcでのきめ細かい制御。たとえば、スタックおよびレジスタコマンドはGNU bcにはありません。

両方のバージョン1.07.1 win32はhttps://embedeo.org/ws/command_line/bc_dc_calculator_windows/にあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.