質問

あなたができることはわかっています #define いくつかの整数がありましたが、C99 より前に C には専用のブール データ型がなかったのはなぜですか?

これはプログラミングやロジックではよくあることですが、明示的な型や表記法が存在しないことが理解できません。

役に立ちましたか?

解決

図書館で少し時間を過ごせば、あれこれ考える必要はありません。以下に抜粋したステートメントをいくつか示します C の進化に関するデニス・リッチーの論文. 。文脈としては、デニスがケン・トンプソンの言語 B をベースに構築しているということです。この言語 B は、非常に小さな PDP-7 (単語アドレス指定マシン) に実装されていました。関心の高まりにより、グループは最初の PDP-11 の 1 つを入手しました。デニスはこう書いています、

PDP-11 の出現により、B の意味モデルのいくつかの欠陥が明らかになりました。まず、BCPL からほとんど変更を加えずに継承された文字処理メカニズムが不器用でした。ライブラリ プロシージャを使用して、パックされた文字列を個々のセルに分散して再パックしたり、個々の文字にアクセスして置換したりするのは、バイト指向のマシンでは扱いにくく、ばかばかしいとさえ感じられるようになりました。

B および BCPL モデルには、ポインターの処理におけるオーバーヘッドが含まれています。言語規則では、ポインタを単語の配列のインデックスとして定義することで、ポインタを単語のインデックスとして表現することを強制しました。各ポインター参照により、ポインターからハードウェアが予期するバイト アドレスへの実行時スケール変換が生成されます。

これらすべての理由から、文字とバイトのアドレス指定に対処し、今後の浮動小数点ハードウェアに備えるには、型指定スキームが必要であると思われました。その他の問題、特に タイプ セーフティとインターフェイス チェックは、当時は後ほど重要ではないようでした。

(私のことを強調してください。)

この論文はさらに、新しいポインタのセマンティクスを発明し、配列を機能させ、この新しい機能を受け入れるために奮闘したデニスの苦闘について説明しています。 struct アイデア。型安全性の概念とブール値と整数の区別は、ずっと後になるまで重要ではないと思われました :-)

他のヒント

Cは、実際には、より高いレベルのアセンブリ言語より少しです。はい、それは、制御構造やその他もろもろを持って、それも確かに必要はありませんアセンブラ種類を得ています。

しかし、言語は、数十年前に設計されました。すべてのboolean型の結果がプロセッサのステータスワードの各ビットに降りるため、そして、それは明らかにそれのために不可欠なデータ型を使用するのに十分でした。そして、あなたは、いくつかの型チェックを省略することができるので、それはおそらく、少し複雑なコンパイラを作った(後の言語に必要のブール値の構造はを制御し、Cに彼らは0または何か他のもののいずれかの整数値を必要とします)ます。

これは、偽およびゼロ以外の任意の真としてゼロを治療するための一般的でした(と、まだいくつかのケースです)。これは、速記のための利点があります。たとえば、代わりにwhile (remaining != 0)のあなただけのwhile (remaining)を使用することができます。

一部の言語では真であることに標準化-1。この理由は、0の-ないビット単位である(ほとんどのコンピュータは、負の数を表すために使用する)2の補数表記で-1(8ビットバイナリで、11111111は小数点-1である)ということである。

時間が経つにつれて、それはコンパイラ定義の定数を使用すると、潜在的な多くの混乱を防止するであろうことを実現しました。それは私がC ++やったので、しばらくしているが、私はゼロ以外の値は依然として「真」に評価されますかなり確信してます。

CPUには「論理型」、彼らはだけなのでboolean型は、それは(あなただけ確認することができたときに、なぜ型を使用する」という利点が得られなかったとして、その時点では意味をなされていないバイトおよびそれらの倍数で作業を持っていません0" または ")" nullでない

私はそれは0が偽であることとし、整数型を有するのに十分なものとみなされた疑いが何もない0真ます。

あなたはブールを(通常)を格納するために使用するタイプは、空間と時間とのトレードオフを体現しています。通常はint型(通常は4バイト)を使用して、(少なくとも、個々の操作のための)最速の結果が得られます。一方、あなたが非常に多くを使用している場合、それはあなたが用途にのみ単一のビットを格納している各値を1つのバイトを使用するか、そうであっても、それらをパックするために多くの意味を作ることができます - しかし、とき/あなたがそれを行う場合には、読み取りまたは書き込み単一ビットは、実質的に、より高価になる(と余分なコードを使用する)。

本当に「右」だった誰も返事がなかったので、

、彼らが書いたプログラムの要件に基づいて作成してユーザーに決定を残しています。

ブール型はC99で追加された理由

本当の問題は、それから、です。私の推測では、要因のカップルが関与していることです。まず、彼らはプログラマのための読みやすさと利便性は通常、現在可能絶対的な最高のパフォーマンスを与えることよりも重要であることに気づきました。それは推測するには、少なくとも可能ですので、第二に、コンパイラは現在、かなり多くのグローバルな分析を行うこと誰かは、私が「ドンものの(特定のプログラムのために最も適切だ表現を選択しようとすると、コンパイラを書くかもしれませんtは本当にないこと任意の)を知ってます。

古い C には実際にはブール型が「欠落」していたわけではありません。ただ、すべての整数型がブール値を格納するという二重の役割を果たすのにも適していると考えられていただけです。これには主に 2 つの理由が考えられます。

  • ビット アドレッシング プロセッサはまったく一般的ではありませんでした (そして今も一般的ではありません)。そのため、コンパイラはスペースを節約するために "true boolean" 型を実際に使用することはできません。ブール値は依然として少なくとも次の値と同じ大きさになります。ある char とにかく (効率的にアクセスしたい場合)。

  • より狭いタイプ int に拡大されます int とにかく式の中で - したがって、ブール演算子は引き続き機能します int オペランド。

..つまり、専用のブール型が実際に実用的な利点をもたらすという説得力のある十分なケースがなかったようです。

C 言語には、ブール値 (0 または 1 のいずれかに定義される) を生成する一連の演算子があることに注意してください。 !, &&, ||, !=, ==, <, <=, > そして >= - したがって、存在しないのは専用のブール型だけです。

歴史的な理由、おそらくます:

重くALGOLの影響を受けた

CPLは、最も可能性の高いboolean型を持っていましたが、私のGoogle-FUは、このための参照を見つけることが十分ではなかったです。しかし、CPLは、あなたが実際に利用可能なハードウェア上でそれを実装できるという利点を持っていたBCPLと呼ばれる機能縮小版、その結果、その時間のためにあまりにも野心的だった。

「単語」 - - 署名2の補数として解釈すると値の0を表すことになり~0の補数を意味0(、場合-1場合はブールコンテキストで偽と真と解釈された

BCPLは、単一のタイプを持っていました整数)。他の値の解釈は実装に依存します。

依然としてタイプなし後継者Bの後、Cは、型システムを再導入し、それは依然として重く前任者のタイプなしの性質によって影響された。

整数と互換性のない別の「ブール」型を追加すると、単に整数を使用する場合よりもコンパイラが複雑になります。整数と互換性のある個別のブール型を持つことで、0または1以外の値をブールオブジェクトに保存することの結果を指定するか、表現が付属のビットパターンが含まれていないブールのオブジェクトで数値計算を実行することの可能な結果を​​指定する必要があります。 0 "nor" 1 "。与えられる:

someBool = intFunction();
someInt = someBool;

intFunction がゼロ以外の値を返した場合に someInt が値 1 を受け取る必要があることを要求すると、一般に上記の処理のコストが高くなります。

someChar = intFunction();
someInt = someChar;

前者のセマンティクスが必要な場合は、ブール型を使用せずに次のようにして実現できます。

someChar = !!intFunction();
someInt = someChar;

ブール型を使用して実行できることはすべてブール型なしでも実行でき、多くの場合、文字型を使用するコードはブール型よりも効率的であるため、実際には存在しなかった(そして今も存在しない)ことをお勧めします。それらが必要です。

彼らはそれがsnippishが鳴ります。申し訳ありませんに1を入れていないが、基本的には、次のような定義されていなかったので。

ほとんどの人がTRUEとFALSE #defineし覚えています。

あなたはブール値が標準であると言うこと - しかし、明らかにそれはC99の前に、標準的ではなかった - 10年前に作られた;)それは欠品明らかになったとき、彼らはそれを追加しました。

はいずれもプログラミング言語で欠落しているデータ型を含め、すべてを予見することはできませんので。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top