了解C ++代码-“获取整数中的位数”

时间:2019-01-10 20:53:09

标签: c++ while-loop

我在理解此代码的工作原理时遇到了麻烦:

int length = 1;
int x = 234567545;
while (x /= 10)
   length++;

应该计算int变量中的位数。我不知道while循环的工作方式。循环是否会变为零并默认停止?另外,为什么长度从1开始?

6 个答案:

答案 0 :(得分:55)

如果您是C ++初学者,可能对您有三点怀疑:

第一件事可能是运算符/=,它结合了整数除法(即无余数)和赋值。因此x /= 10实际上与x = x / 10相同。

第二,C ++中的每个表达式在求值后都有一个值。对于类似(x = 0)的分配,结果是分配后的x的值,即0

第三,在C ++中,诸如if (x) ...为整数类型的条件xif(x != 0)的含义相同,即如果falsex等于0,如果truex以外的其他值,则为0

全部:while ( x /= 10 )表示将x的整数除以10的值,然后将该值与0进行比较。如果到达0,则循环结束。

BTW:length1开头,因为任何数字,甚至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为个位数大,那将是错误的。

手动手动计算此示例:

  1. 234567545/10 = 23456754,这是正确的,因此while循环继续进行,长度变为2。

  2. 23456754/10 = 2345675,是。长度变成3。

  3. 2345675/10 = 234567,是。长度变成4。

  4. 234567/10 = 23456,是。长度变成5。

  5. 23456/10 = 2345,是。长度变成6。

  6. 2345/10 = 234,是。长度变成7。

  7. 234/10 = 23,是的。长度变成8。

  8. 23/10 = 2,是。长度变成9。

  9. 2/10 = 0,否。 while循环的长度等于9。

答案 2 :(得分:8)

循环

while (x /= 10) {
  length++;
}

将一直持续到x /= 10的结果评估为false,因为0意味着false,它将一直持续到x /= 100。整数除法会截断,以确保达到条件。可以通过添加一个简单的调试语句来说明这一点,即

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。这样便终止了循环。

因此,条件是同时存在两件事:

  • 它是一个值,与0进行比较。循环一直进行到 计算结果为0。
  • 这是一个赋值:x每次评估都会获得一个新值。它除以10,所以收敛到0。

答案 5 :(得分:-9)

您会在C / C ++中经常看到这有点愚蠢,这是利用TRUE被实现为非零而FALSE被实现为零*这一事实。因此x反复除以10,表达式最终变为零,因此循环停止。

尽管令人困惑,但这仍然有效-直到有人赶时间将x从int更改为double时:-)更清晰,更不易出错地编写“ while(x / = 10> = 1)”,或者甚至将数学放在循环体内,而不是放在条件中。

*恕我直言,C的几个缺点之一是它不像FORTRAN那样具有显式的逻辑类型。