考虑以下“神秘”功能:
void pb(int n)
{
if (n != 0)
{
pb(n / 2);
putchar('0' + n % 2);
}
}
如果我在这个函数中输入一个数字,该函数会做什么?
此外,putchar('0' + n % 2)
在此功能中做了什么?
答案 0 :(得分:2)
如BLUEPIXY所述,函数pb()
接受整数n
作为参数并打印其二进制等效值。
putchar('0' + n % 2)
用于打印二进制文件。
'0'
会将编码值设为零(如果是ASCII,则值为48)。添加'0'
或1
的{{1}}值将分别给出编码值1或0。
让我们考虑0
为n
的示例。
10
的二进制文件为10
。
1010
pb(10); ----> putchar('0' + 10%2); ----> 0
pb(5) ----> putchar('0' + 5%2); ----> 1
pb(2) ----> putchar('0' + 2%2); ----> 0
pb(1) ----> putchar('0' + 1%2); ----> 1
pb(0)
被递归调用,直到它的参数为pb()
,并且对应于每个递归打印一个位的值。
通过这种方式,对于0
,会打印出10
。
答案 1 :(得分:-5)
关于:
putchar('0' + n % 2);
n%2
将导致0或1.
然而,' +'运营商的优先级高于'%'运算符所以这一行不会做预期的事情。
' 0'是一个字符0,实际上包含' 0x30'因此,该行应该向显示器输出0或1。
为了使其正常工作,建议使用parens,如:
putchar( '0' + (n % 2) );
关于该功能做什么
我在代码中添加了评论
void pb(int n)
{
if (n != 0) // check if need to perform another recursion
{
pb(n / 2); // recursive call to 'pb()'
// passing the 'n' parameter divided by 2.
// this in an integer divide,
// so when the parameter is less than 2
// the result will be 0
putchar('0' + n % 2);
// this line will be executed
// after all the following recursive calls have exited
// the result is:
// output the original 'n' value as a binary number,
// with the most significant bit displayed first
}
}
注意:这个递归功能会“吃掉”。很多堆栈空间。使用简单的循环
要好得多