2011-12-23 186 views
1

我在看下面的一段代码:积分n指定的条件“if(n/10)”是什么?

void printd(int n) 
{ 
    if (n < 0) { 
     putchar('-'); 
     n = -n; 
    } 
    if (n/10) 
     printd(n/10); 
    putchar(n % 10 + '0'); 
} 

我知道,第一if语句罚款,但第二个有我困惑的几个百分点。

本身,因为“n”是一个整数,我知道n/10会将小数点左移一次 - 有效地移除数字的最后一位;然而,我在理解一个事情本身如何成为一个条件而不知道结果是什么时遇到了一些麻烦。为什么不是((n/10)> = 0)或什么的情况?

此外,为什么'0'传入putchar()调用?

有人可以告诉我,如果你要用英语朗读它怎么读?

谢谢!

+2

在一个if语句条件中,零:= false,其他都是真的...... – 2011-12-23 05:08:57

+0

啊好的,所以它每次除以10,直到结果为0;在不等于零时执行代码。 – bqui56 2011-12-23 05:12:47

+2

另外,缩进在第二个“if”中会引起误解。 'putchar'不在里面。 – 2011-12-23 05:13:44

回答

3

如果结果为0,则n/10将评估为false,否则为true。本质上它检查是否n > 10 && n < -10(-10不来这里发挥作用,由于n = -n代码)

+ '0'为字符偏移量,字符“0” - “9”不被数字0-9表示,而是在一个偏移量(以ascii 48-57)。

有人可以告诉我,如果你要用英语朗读它怎么读?

如果你谈论的是有条件的,那么我会说:“如果整数n除以10不为零”

+0

检查'n <-10'的唯一时间是在进入函数时(并且机器使用2的补码运算),如果'n'是'INT_MIN'。 – 2011-12-23 05:35:36

0

n/10不会移位十进制数,因为n是一个整数。如果n = 25,那么n/10将是2(没有任何小数点),类似地,如果n = 9,那么n/10将是0,在这种情况下if条件将不会被满足。

关于+'0',由于n%10产生整数结果,并且在putchar中打印的是char,所以需要将该整数转换为char。这通过将ascii值0添加到整数来完成。

0

在C中,没有单独的布尔类型;像a > b这样的表达式如果为false,则评估为零,如果为真,则为非零。有时你可以在int中测试零或非零时利用这一点。

至于'0',只是执行字符算术,以便打印右侧字符。零字符具有不为零的ASCII编码值,所以n值被用作与该编码的偏移以获得打印出的右数字数字。

+1

有时,您需要阅读C99(或C11)标准以了解关于'_Bool'和''的信息。 – 2011-12-23 05:34:17

+0

它是**保证,** a> b'评估为0或1(而不是一些其他非零值)。只是在**条件下**表达式的非零值被视为* true *。 – Jens 2012-05-29 18:11:38

+0

@Jens:我从来没有声称'a> b'会评估为0或1以外的任何值。我所说的只是它非零,如果为真,*这是真的,因为1不是0 *。 – 2012-05-29 19:05:00