putchar('0' + num); 是什么意思?

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
所以我猜想,如果 r=0,则 putchar('0' + r); 打印0,如果 r=1,则打印1,或者其他情况发生了?
4个回答

6
在C语言中,'0' + digit是将一个一位数整数转换为其字符形式的便宜方法,例如ASCII或EBCDIC。如果使用ASCII,则可以将其视为将0x30('0')加到数字上。
唯一的假设是字符编码具有用于数字的连续区域,这适用于ASCII和EBCDIC。
如评论中指出的那样,C++和C标准都需要此属性。C标准表示:

5.2.1 - 3

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


1
实际上,“一个假设..”是 必需的:https://dev59.com/2mox5IYBdhLWcg3wIQ1o - Jongware
@Jongware 谢谢。我添加了 C 标准的引用 - 我不知道 C++ 是否也有这个。 - cnicutar
然而需要注意的是,如果你正在编写一个必须使用特定字符集的文件或网络流解析器,那么你应该针对该字符集中发现的数值编写代码,这样可以清楚地表明(也便于阅读代码的人理解)。 - datenwolf

4

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

'0' + r48 + r相同。当r = 0时,表达式的值为48,因此输出0。另一方面,当r = 1时,表达式的值为49,因此输出1。换句话说,'0' + 1 == '1'

基本上,这是一种将十进制数转换为其ASCII字符表示的简单方法。它也适用于字母表(即 'A' + 2 相当于 C


关于'A' + n的部分在EBCDIC系统中并不总是正确的...请参考cnicutar的回答。 - user539810
实际上,标准并不强制要求使用'A'+n,甚至没有下限(例如强制前六个字母必须这样做)。它在ASCII码中对于所有非重音拉丁字母和EBCDIC码中的A到I(使十六进制转换更容易)恰好有效,但是可能存在一种字符集没有这种特性。 - Medinoc

2

这是一种常用的用于处理字符的技术。

char a = '0' + r(其中r在[0,9]范围内)将根据给定的字符基数(即在这种情况下为'0'),把整数转换为其字符格式,您将得到'0'...'9'

同样地,char a = 'a' + rchar a = 'A' + r(其中r在[0,25]范围内)将把整数转换为其字符格式,您将得到'a'...'z''A'...'Z'除了在EBCDIC系统中,字母区域是不连续的)。


编辑:

  1. You can also do the other way around, for example:

    char myChar = 'c';
    int b = myChar - 'a'; // b will be 2 
    
  2. Similar idea is used to convert a lowercase char to uppercase:

    char myChar = 'c';
    char newChar = myChar - 'a' + 'A'; // newChar will be 'C' 
    

关于'A' + n和字母表的字符编码在EBCDIC系统中并不总是正确的...请参考cnicutar的回答。 - user539810

0

您正在添加数字的ASCII值,例如'0'的ASCII值为48

'1' -> 49,以此类推点击此处查看完整表格

因此,当您将1添加到48时,它将变成49,并且putchar函数会打印发送给它的字符。当您执行此操作时

putchar('0' + r ) 

如果 r = 1,则 putchar(48 + 1)(转换为 ASCII 值)

putchar(49) 即为 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接