2

どこかで、ある教授が C プログラミング言語には矛盾があると主張しているのを読みました。これは正しいですか? もしそうなら、それは何ですか?

教授が提唱した議論は、ある型(おそらくchar)ではできるが別の型(おそらくint)ではできないことがあり、一貫性のために実際にできることは可能であるべきだというものだったことを覚えていると思いますCと一緒じゃない。

ここで私が何を意味するか知っていますか、それともこの概念に対するサポートはありませんか?

関連: https://stackoverflow.com/questions/3486059/inconsistency-in-programming-languages

4

5 に答える 5

3

いくつかあります:

  • 他の型とは異なり、配列をオブジェクト全体として直接割り当てたり渡したりすることはできません
  • char x[]発生する場所 (関数パラメーター内かどうか) に応じて、配列またはポインターのいずれかを宣言します。
  • "str"配列として (sizeof("str")またはでchar s[] = "str") またはポインタとして ( でputs("str");)動作します。
  • "str"タイプはchar*ですが、それが指すものを合法的に変更することはできませんconst char*
  • %ffor doubleinを使用しprintf()ますが、%lffordouble%ffor floatinを使用しますが、 for定数scanf()を使用します (例: )ffloat1.0f
  • -1 > 1u、あまり意味がない
  • UINT_MAX + 1 + 1.0とはかなり異なりますが、UINT_MAX + 1.0 + 1同様に驚くべきことかもしれません

ただし、ほぼすべての場所に回避策があります。

于 2013-01-29T08:13:58.873 に答える
1

おそらく、charビットのパディングは許可されていません。値intの範囲unsigned charは常に2CHAR_BIT広いですが、値の範囲はsigned char最大1つ少なくなる可能性があります。タイプの範囲は、サイズと値( 8でない限り)intから決定できません。および2)。CHAR_BITCHAR_BITsizeof (int)

于 2013-01-29T08:28:41.507 に答える
1

常に署名されているのに対し、デフォルトで署名または署名なしにすることができるのは事実かもしれません。charint

しかし、それはタイプ間の不一致かもしれませんが、それは私が欠点と見なすものではありません-それはよく理解されています(またはそうあるべきです)。

また、サブキャラクタ型 (つまり、ビットフィールド) は&アドレス演算子でアドレス指定できないのに対しcharintやユーザー定義構造体などの他の型はアドレス指定可能です。これは、複数のビットフィールドを 1つのアドレスで組み合わせることができるためです。

C には他にも 50 のマイナーな矛盾があることに疑いの余地はありません。

于 2013-01-29T07:23:33.237 に答える
1
"...is some inconsistency..."

いいえ、それは正しくありません。多数の矛盾、複数形があります。そのようなすべての問題に名前を付けるには、多くのページのエッセイが必要です。要約すると、C 言語が正常で、一貫性があり、論理的であると思い込むことは、最悪の場合です。

char に関する特定の問題に関して、C には、すべての整数型が暗黙的に署名されていることを保証する規則があります。たとえば、書き込みintは常に書き込みと完全に同等signed intです。これは には当てはまりますがint, long, short, long long、 には当てはまりませんchar

これは、char が最小の整数型であるだけでなく、文字、つまり ASCII シンボル値を格納するためにも使用されるためです。char がデフォルトで符号付きか符号なしかは実装定義です。コンパイラはどちらかの形式を選択できます。

この理由は、私の記憶が正しければ、C の最初の標準化の前に C コンパイラがさまざまな方法で char を実装していたという、古い後方互換性の問題です。

char およびその他の「小さい整数型」(short および bool) に関するもう 1 つの問題は、それらが式の一部である場合は常に、より大きな整数型が昇格される方法と一致しない方法で暗黙的に型が昇格されることです。これは整数昇格規則として知られており、「通常の算術変換」(詳細はこちら) の一部であり、C が一貫性のない非論理的な言語であることを示すもう 1 つの完璧な例です。

于 2013-01-29T07:41:30.323 に答える
0
char str[] = "Hello";
const char *str2 = "World";

私があなたを正しく理解しているなら、上記は以下のためだけに意味のある働きをする2つの機能ですchar

于 2013-01-29T07:23:01.277 に答える