21

C / C ++ stdlibsのほとんどの文字列関数がchar*ポインタを受け取るのはなぜですか?

char最新のコンパイラ(GCC、MSVC)のほとんどはデフォルトで署名付きとして扱われますが、の署名は標準では指定されていませんchar

文字列を(おそらく)符号付きバイトとして扱うことが理にかなっているのはいつですか?AFAIKどの文字セットにもゼロ未満の意味のある文字値はありません。unsigned char特定の文字列操作では、値をとにかくキャストする必要があります。

では、なぜstdlibsが使用するのchar*でしょうか。?C++などの特定の方法でもstring::string(const char *);

4

7 に答える 7

10
  1. ほとんどの文字列関数は、の存在よりも前のものであると確信していますunsigned char
  2. プレーンcharは、符号付きタイプまたは符号なしタイプのいずれかです。CおよびC++標準では、どちらか一方が明示的に許可されています(これは、常にまたはのいずれかとは別の型ですが、どちらか一方unsigned charsigned char同じ範囲です)。
  3. C文字列関数はを使用しますがchar *std::stringこれはほとんどのC++で使用されているものです。
于 2012-06-24T03:27:23.993 に答える
10

C標準は、プレーンcharが署名されているか署名されていないかという問題にとらわれず、とはchar異なるものとして一意に扱いsigned charます。さらに、ほとんどの主要な制御文字と英語の印刷可能な文字を含む基本ASCII文字セットは128文字で構成されているため、符号付きで適切に表すことができますchar(少なくとも1バイトあたり8ビットを提供するシステムでは)。Jim Balterが指摘しているように(以下のコメントを参照)、ASCIIはC言語の完全な基本文字セットを構成していませんが、一般的な使用法では文字の大部分が含まれていると思います。ASCIIのプロパティ(必ずしも一意ではありませんが)に依存するCコードの大規模なコーパスもあります(たとえば、NUL値がゼロの特殊文字、英数字が順番に昇順で配置されるなど)。

于 2012-06-24T03:30:58.817 に答える
5

ジム・バルターはコメントで次のように述べています

バイトを扱うPDP-11の説明では、バイトを符号付きの量として扱っていたため、初期のCコンパイラはバイトを扱い、符号なしも存在しませんでした。

charこれが、デフォルトの文字タイプが署名されていない必要がない理由の答えであると強く思いますが、確実にするために、いくつかの書面による履歴アカウントからの引用が必要になります。

署名する必要がない理由(!)については、Clearpath Doradoなどの2の補数以外のマシン(私が知っている唯一のマシンで、まだ使用されている可能性があります)では、aはsigned charのすべての値を保持できません。unsigned char負のゼロ、またはそのビットパターンが使用されるものに1つのビットパターンを浪費しています。char署名が必要な場合、これは一般的なデータをchar値のシーケンスとして再解釈するための問題になります。したがって、そのようなマシンcharでは署名されていない必要があります。そうでない場合、ソフトウェアはそれに対処するために極端なゆがみに関与している必要があります。

于 2012-06-24T10:47:56.697 に答える
2

BjarneがC++プログラミング言語で述べたように、acharが符号付きと見なされるか符号なしと見なされるかは実装に依存し、C++言語は実装ごとに2つのタイプを提供します。

于 2012-06-24T03:35:06.587 に答える
2

他の人は、Cが最初に考案され、(後で)標準化されたときにこのようになっていたという歴史的な理由を調べましたが、このように見える異常が今日まで続く別の理由があります。

単に、char文字に使用している場合、それが署名されているか署名されていないかを知る必要がないということです。標準ライブラリは、文字の表現に関係なく、文字を操作するための移植可能な関数を提供します。これらの関数を無視して、文字の比較と算術演算を行うことを主張する場合は、発生するすべてのバグに値します。

簡単な例を挙げると、文字が式c >= ' 'または同等のものを使用して印刷可能かどうかを確認することは非常に一般的ですが、代わりc >= 0x20に使用する必要がありますisprint(c)。そうすれば、署名付き/署名なしの混乱にさらされたり、プラットフォームに依存するエラーがプログラムに導入されたりすることはありません。

算術演算に小さい(通常は8ビット)整数のみを使用する習慣を身に付け、文字データを操作する場合にのみ使用するsigned charと、実装が定義された別の型であることが完全に自然に見えるようになります。符号付きであり、文字列処理関数が符号付きまたは符号なしのバリアントではなく常に使用することはさらに自然です。の符号は、の符号とほぼ同じように見えます。unsigned charcharcharcharchar *charbool

于 2012-06-29T00:20:47.977 に答える
0

Charは、標準で符号付きでも符号なしでもありません。https://stackoverflow.com/a/2054941/396583を参照してください

于 2012-06-24T03:27:34.840 に答える
0

C / C ++stdlibsのほとんどの文字列関数がchar*ポインタを受け取るのはなぜですか?

C ++では、std::stringを使用します。Cでは、符号なしタイプが導入されたときに使用パターンがすでに確立されすぎていたため、効率の問題を排除するつもりはありませんでした。

ゼロ未満の意味のある文字値はありません

C ++標準のどこかに、基本文字セットの文字が正であるという制約があります。しかし、その制約がすべてのキャラクターに当てはまると考えるのはナイーブです。

この制約により、エンコーディングシステムとしてのEBCDICがcharをunsignedできるようにする実装が強制されます。

最新のコンパイラ(GCC、MSVC)のほとんどは、charをデフォルトで署名付きとして扱います。

gccの動作はターゲットによって異なり、ターゲットのデフォルトを変更するオプションがあります。

于 2012-06-24T08:26:40.887 に答える