2

読者、

この誤ったコードを実行すると、コンピューターで何が起こるかを誰かに説明してもらえますか。gnugccコンパイラでコンパイルされます。コードブロックで。

これは誤ったコードです:

  char data[5];

  data[0] = '1';
  data[1] = '10';
  data[2] = '30';
  data[3] = '50';

  if(sizeof(data) == 5)
  {
  adjust(data);
  }

char data [5]を宣言したため、sizeof(data)は5です。

data [1]を読み込もうとすると、最後の文字が返されることに気づきました。'0'または'48'のいずれか。

それで、data [1]の「1」はどうなり、私の記憶はどうなるのだろうと思っていました。

4

2 に答える 2

3

のような複数文字のリテラルを使用していることは少し混乱します。10これはおそらく混乱を助長します。このような行で何が起こるか:

data[1] = '10';

は:

  • int-type(Cではではない)値は に切り捨てられますchar'10'char
  • 結果の値はに割り当てられdata[1]ます。

リテラルは単一のに収まる値よりも大きいため、これが正確にどの値であるかはコンパイラに依存しcharます。

表示されている場合0(ASCIIシステムでは48)、これは、格納されている値である10に切り捨てられたことを意味します。0その後1、は完全に失われました(予想していたように、アレイの隣接するスロットには保存されませんでした)。

于 2012-05-21T07:41:45.050 に答える
1

の効果を除いてadjust()、何が起こるかは非常に明確です。

  • data[]5つの要素が割り当てられます
  • 1番目から4番目の要素が定義されています
  • のサイズはdata[]5と比較されます
  • Adjust()は、の先頭へのポインタを使用して呼び出されますdata[]

読書についてのあなたのコメントがわかりませんdata[1]。割り当てられるまで未定義のものが含まれています。

char x = '10';char x = '0'ほとんどのアーキテクチャと同じです。これは、C++からの動作の逸脱です。 char式はほとんど整数として処理され、保存時に暗黙的に型キャストされます。

于 2012-05-21T07:39:58.403 に答える