8

私はそのputchar('0' + r);仕組みを理解しようとしています。以下の関数は整数を取り、それをバイナリに変換します。

void to_binary(unsigned long n)
{
   int r;
   r = n % 2;
   if (n >= 2)
      to_binary(n / 2);
   putchar('0' + r);
}

putcharの定義をグーグルで検索しましたが、これは見つかりませんでした。それをテストするために、r の値を確認するために printf を追加しました。

void to_binary(unsigned long n)
{
   int r;
   r = n % 2;
   if (n >= 2)
      to_binary(n / 2);
   printf("r = %d and putchar printed ", r);
   putchar('0' + r);
   printf("\n");
}

そしてそれを実行し(5と入力)、次の出力を得ました:

r = 1 および putchar は 1 を出力
r = 0 および putchar は 0 を出力
r = 1 および putchar は 1 を出力

r=0 の場合はputchar('0' + r); 0 を出力し、r=1 の場合は 1 を出力するか、何か他のことが起こると思いますか?

4

4 に答える 4

6

C'0' + digitでは、1 桁の整数を ASCII や EBCDIC などの文字表現に変換する安価な方法があります。たとえば、数字にASCII0x30 ( ) を追加すると考えてください。'0'

1 つの仮定は、文字エンコーディングには数字用の連続した領域があるということです。これは ASCII と EBCDIC の両方に当てはまります。


コメントで指摘されているように、このプロパティは C++ 標準と C 標準の両方で必要です。C標準は次のように述べています。

5.2.1 - 3

ソースおよび実行の基本文字セットの両方で、上記の 10 進数のリストの 0 の後の各文字の値は、前の値よりも 1 大きくなります。

于 2014-01-21T10:12:27.817 に答える
3

'0'10 進数で 48 に等しい整数を表し、文字0(ゼロ) の ASCII コードです。の文字の ASCII コード1は 10 進数で 49 です。

'0' + rと同じ48 + rです。r = 0 の場合、式は 48 と評価されるため、a0が出力されます。一方、r = 1 の場合、式は 49 と評価されるため、a1が出力されます。言い換えると、'0' + 1 == '1'

基本的に、これは 10 進数を ASCII 文字表現に簡単に変換する優れた方法です。アルファベットでも動作します (つまり'A' + 2、 と同じですC) 。

于 2014-01-21T10:14:01.390 に答える
2

charハンドリングによく使われるテクニックです。

char a = '0' + r'0'(r in [0,9]) は、指定された char ベース (つまり、この場合) に基づいて整数を char 形式に変換します。'0'...'9'

同様に、char a = 'a' + ror char a = 'A' + r(r in [0,25]) は整数をその char 形式に変換し、'a'...'z'orを取得します'A'...'Z'(アルファベットの不連続領域を持つEBCDIC システムを除く)。


編集:

  1. 逆の方法も可能です。たとえば、次のようにします。

    char myChar = 'c';
    int b = myChar - 'a'; // b will be 2 
    
  2. 同様の考え方を使用して、小文字の char を大文字に変換します。

    char myChar = 'c';
    char newChar = myChar - 'a' + 'A'; // newChar will be 'C' 
    
于 2014-01-21T10:16:32.517 に答える
0

U は数値の ASCII 値を追加しており、「0」と言います。ASCII 値は 48 です。

'1' -> 49 など完全なテーブルについては、ここを確認してください

したがって、48 に 1 を追加すると 49 になり、putchar 関数はそれに送信された文字を出力します。あなたがするとき

putchar('0' + r ) 

if r = 1 putchar(48 + 1) (ASCII 値に変換)

1 である putchar(49)

于 2014-01-21T10:17:55.743 に答える