我在理解此代码的工作原理时遇到了麻烦:
int length = 1;
int x = 234567545;
while (x /= 10)
length++;
应该计算int变量中的位数。我不知道while
循环的工作方式。循环是否会变为零并默认停止?另外,为什么长度从1开始?
答案 0 :(得分:55)
如果您是C ++初学者,可能对您有三点怀疑:
第一件事可能是运算符/=
,它结合了整数除法(即无余数)和赋值。因此x /= 10
实际上与x = x / 10
相同。
第二,C ++中的每个表达式在求值后都有一个值。对于类似(x = 0)
的分配,结果是分配后的x
的值,即0
。
第三,在C ++中,诸如if (x) ...
为整数类型的条件x
与if(x != 0)
的含义相同,即如果false
为x
等于0
,如果true
除x
以外的其他值,则为0
。
全部:while ( x /= 10 )
表示将x
的整数除以10
的值,然后将该值与0
进行比较。如果到达0
,则循环结束。
BTW:length
以1
开头,因为任何数字,甚至0
,都包含至少一位数字。
答案 1 :(得分:25)
x / = 10连续将x除以10,这最终将使其除以0,并由于将0解释为false(而将除0以外的任何其他值视为true)而导致while循环终止。
开始于length = 1的原因是因为数字中始终至少有1位数字:如果x从0到9(含0和9),则x / = 10会使x立即变为0,这意味着x内无任何内容。循环将执行。因此,如果长度从0开始,它将永远不会增加到1,如果x为个位数大,那将是错误的。
手动手动计算此示例:
234567545/10 = 23456754,这是正确的,因此while循环继续进行,长度变为2。
23456754/10 = 2345675,是。长度变成3。
2345675/10 = 234567,是。长度变成4。
234567/10 = 23456,是。长度变成5。
23456/10 = 2345,是。长度变成6。
2345/10 = 234,是。长度变成7。
234/10 = 23,是的。长度变成8。
23/10 = 2,是。长度变成9。
2/10 = 0,否。 while循环的长度等于9。
答案 2 :(得分:8)
循环
while (x /= 10) {
length++;
}
将一直持续到x /= 10
的结果评估为false
,因为0
意味着false
,它将一直持续到x /= 10
为0
。整数除法会截断,以确保达到条件。可以通过添加一个简单的调试语句来说明这一点,即
while (x /= 10) {
length++;
std::cout << length << " " << x << std::endl;
}
哪个输出
2 23456754
3 2345675
4 234567
5 23456
6 2345
7 234
8 23
9 2
答案 3 :(得分:4)
整数除法将截断余数,因此用整数除法连续除数将不可避免地导致零。
每次将所得商(存储回n
中的商不为零时,将数字i
除以10并同时对计数器n
进行一次递增将导致{{1} },其中包含i
的以10为基数的位数。
答案 4 :(得分:3)
有助于理解两个部分:
此:
00:45:30.0000000
与以下相同:
x /= 10
条件为假时,x = x / 10
循环终止。 0等于false。
while
所以x每次循环时都除以10,直到is为0。这样便终止了循环。
因此,条件是同时存在两件事:
答案 5 :(得分:-9)
您会在C / C ++中经常看到这有点愚蠢,这是利用TRUE被实现为非零而FALSE被实现为零*这一事实。因此x反复除以10,表达式最终变为零,因此循环停止。
尽管令人困惑,但这仍然有效-直到有人赶时间将x从int更改为double时:-)更清晰,更不易出错地编写“ while(x / = 10> = 1)”,或者甚至将数学放在循环体内,而不是放在条件中。
*恕我直言,C的几个缺点之一是它不像FORTRAN那样具有显式的逻辑类型。