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的定义,但没有找到。为了测试它,我添加了一个 printf 来查看 r 的值:

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

所以我想putchar('0' + r); 如果 r=0 打印 0,如果 r=1 打印 1,或者发生其他事情?

4

4 回答 4

6

在 C'0' + digit中,是一种将一位整数转换为其字符表示形式的廉价方法,例如 ASCII 或 EBCDIC。例如,如果您将ASCII其视为将 0x30 ( '0') 添加到数字。

一个假设是字符编码有一个连续的数字区域——这对 ASCII 和 EBCDIC 都成立。


正如评论中所指出的,C++ 和 C 标准都需要此属性。C标准说:

5.2.1 - 3

在源和执行基本字符集中,上述十进制数字列表中 0 之后的每个字符的值都应比前一个字符的值大 1。

于 2014-01-21T10:12:27.817 回答
3

'0'表示等于十进制 48 的整数,是字符的 ASCII 码0(零)。字符的 ASCII 码1是十进制的 49。

'0' + r是一样的48 + r。当 r = 0 时,表达式的计算结果为 48,因此0输出 a。另一方面,当 r = 1 时,表达式的计算结果为 49,因此1输出 a。换句话说,'0' + 1 == '1'

基本上,这是将十进制数字轻松转换为其 ASCII 字符表示的好方法。它也适用于字母表(即'A' + 2与 相同C

于 2014-01-21T10:14:01.390 回答
2

这是用于char处理的常用技术。

char a = '0' + r(r in [0,9]) 将根据给定的 char 基数将整数转换为其 char 格式(即'0'在本例中),您将得到'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 myChar = 'c';
    char newChar = myChar - 'a' + 'A'; // newChar will be 'C' 
    
于 2014-01-21T10:16:32.517 回答
0

你正在添加数字的 ASCII 值,比如 '0' ASCII 值是 48

'1' -> 49,依此类推,查看完整表格

因此,当您将 1 添加到 48 时,它将 49 并且 putchar 函数打印发送给它的字符。当你这样做的时候

putchar('0' + r ) 

if r = 1 putchar(48 + 1) (转换为 ASCII 值)

putchar(49) 是 1

于 2014-01-21T10:17:55.743 回答