2016-11-01 5 views
-4

Iは、次のコードスニペットを持って理解する:アクセスCの特殊なタイプ++/Cアレイ

int ndigit[10] = {0,0,0,0,0,0,0,0,0,0}; 

void count() { 
    char c; 
    while (cin.get(c)) { 
    if (c>='0' && c<='9') { 
     ndigit[c-'0']++; 
    } 
} 

をだからc(0および9で)0と9の間でなければならないので、インデックスに必要な理由配列ndigit[c-'0']の代わりにndigit[c]の代わりに?私は右だ場合

、両方のケースでc値は一度、より多くのを発生することがありますので、ndigit[c-'0']の値は、私はあなたの知恵に感謝...とにかく

を上書きされます!あなたはX00(バイナリ0)を必要とする配列の最初の要素にアクセスするには

+8

「0」!= 0' – Biffen

+3

これは重複排除の対象となるが、関連性が高いかどうかは不明です。http://stackoverflow.com/questions/15598698/why-does-subtracting-0-in-c-result -in-the-the-char-is-representing – NathanOliver

答えて

1

"だからc09の間でなければならない"

No!cがい0x30からのsubracting '9'となり、違いが生じます。

すべての文字は適切な数値(ASCIIコード)を持ちます。 G .:

  • '' 65
  • 'B' を有する66
  • が '文字は単に番号、eはC言語で98

を有しています。 g。 'A' + 'B'は完全に有効な式であり、65 + 66を意味します。

digit(0,1、...、9)を表示または読み取るには、実際にその記号表現iを使用します。 e。 character( '0'、 '1'、...、 '9')。そして、これらの文字は驚くほどです ASCII値0,1、...、9、しかし48、49、... 57 - それらはすべてshifted by 48です。

数字を変換するためにsymbol、e。 g。 '7'(ASCII値は55-を7 + 48とする)を、我々がそれに見られるnumber(すなわち、7 - )アポストロフィなしに、我々は単に、そのASCII値からこのシフト番号48を引く必要があります

(7 + 48) - 48 

'7' から'0'(= 48)を減算することと同じである(= 55):

'7' - '0' 

と魔女式

c - '0' 
をまったく同じものですあなたのコードに

2

あなたはこのプログラムへの入力として文字0を入力するときは、16進値X30でバイトを取得します(http://www.asciitable.com/を参照)

。型付きcharからx30を引くと、0が返されます。

0-9のASCIIコードはx30、x31、.. x39であるため、ロジックが機能します。だから、'0'との間になるようにあなたを与えるだろう( '0' と同じことが、または)0-9

+4

ASCIIエンコーディングまたは同様のものを想定しています。必ずしも真である必要はありません。 C++とCの両方の標準では、エンコーディングが順番に、そして1つのブロックで '0'から '9'までであることを主張しています。 – Bathsheba

+0

はもちろんアスキーではないマシンかもしれませんが、私の10cはそれが – pm100

+0

だと言いますが、どのエンコーディングでも動作しますが、実際の値がはっきりしていることがわかります – pm100

関連する問題