我正在查看以下代码:
void printd(int n)
{
if (n < 0) {
putchar('-');
n = -n;
}
if (n / 10)
printd(n / 10);
putchar(n % 10 + '0');
}
我理解第一个if语句很好,但第二个让我困惑了几点。
由于“n”是一个整数,我知道n / 10会将小数点向左移一次 - 有效地删除了数字的最后一位数;但是,我有点麻烦理解这可能是一个条件本身而不是结果等于什么。为什么不是条件if((n / 10)&gt; = 0)或什么?
另外,为什么'0'传递给putchar()调用?
有人可以告诉我,如果你用英语大声朗读它会怎么读?
谢谢!
答案 0 :(得分:3)
如果结果为0,n / 10
将评估为false,否则为true。基本上它正在检查n > 10 && n < -10
(由于n = -n
代码,-10在这里没有发挥作用)
+ '0'
用于字符偏移,因为字符“0” - “9”不是由数字0-9表示,而是在偏移处(48-57表示ascii)。
有人可以告诉我,如果你用英语大声朗读它会怎么读?
如果你在谈论条件,那么我会说“如果整数n除以10不是零”
答案 1 :(得分:0)
n/10
不会移动十进制数,因为n
是一个整数。除法将产生如下结果:如果n = 25,则n/10
将为2(没有任何小数点),类似地,如果n = 9,则n / 10将为0,在这种情况下{{1}条件不满意。
关于if
,因为n%10产生整数结果,而+'0'
中正在打印putchar
,所以需要将整数转换为char。这是通过将ascii值0添加到整数来完成的。
答案 2 :(得分:0)
在C中,没有单独的布尔类型;像a > b
这样的表达式如果为false则求值为零,如果为真则求值为非零。有时,当在int中测试零或非零时,您可以利用这一点。
对于'0'
,它只执行字符运算,以便打印正确的字符。零字符的ASCII编码值不为零,因此n
值用作该编码的偏移量,以便打印出正确的数字。