Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解C++;代码-“;获取整数中的位数";_C++_While Loop - Fatal编程技术网

C++ 理解C++;代码-“;获取整数中的位数";

C++ 理解C++;代码-“;获取整数中的位数";,c++,while-loop,C++,While Loop,我很难理解此代码到底是如何工作的: int length = 1; int x = 234567545; while (x /= 10) length++; 它应该计算int变量中的位数。我不知道循环如何工作。循环是否默认为零并停止?另外,为什么长度从1开始?整数除法将截断余数,因此连续用整数除法除数将不可避免地导致零 将一个数字n除以10,同时将计数器i每次递增一次,所得商(存储回n)不为零将导致i包含n以10为基数表示的位数。这有助于理解两部分: 什么是“/=” 循环何时终止 解

我很难理解此代码到底是如何工作的:

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

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

整数除法将截断余数,因此连续用整数除法除数将不可避免地导致零


将一个数字
n
除以10,同时将计数器
i
每次递增一次,所得商(存储回
n
)不为零将导致
i
包含
n
以10为基数表示的位数。这有助于理解两部分:

  • 什么是“/=”
  • 循环何时终止
解释“/” 这:

同:

x = x / 10
解释循环何时终止 当条件为false时,
while
循环终止。0等于false

while (condition) {
    length++;
}
所以x是,每次通过循环,除以10,直到is为0。这就终止了循环

因此,条件是两件事同时发生:

  • 它是一个与0相比较的值。循环一直持续到今天 计算结果为0
  • 这是一个赋值:x每次求值都会得到一个新值。它除以10,所以收敛到0
循环

while (x /= 10) {
  length++;
}
将一直持续到
x/=10
的结果计算为
false
,因为
0
意味着
false
它将一直持续到
x/=10
0
。整数除法截断,确保达到条件。这可以通过添加一个简单的调试语句来说明,即

while (x /= 10) {
  length++;
  std::cout << length << " " << x << std::endl;
}

如果你是C++初学者,有三个问题可能对你产生怀疑:

首先可能是运算符
/=
,它将整数除法(即无余数)与赋值相结合。因此
x/=10
实际上与
x=x/10
相同

第二,C++中的每个表达式在经过评估后都有--一个值。对于像

(x=0)
这样的赋值,结果是赋值后
x
的值,即在这种情况下为
0

< >第三,如C++的一个条件,如(x)…< />代码>代码> x/Cube是积分类型,在C++中与“代码”相同(如果(x!=0),即<代码> x>代码>等于<代码> 0 < /COD>,则是<代码>真< /代码>如果<代码> x>代码>除<代码> 0 < /C> >之外> 总之:
while(x/=10)
表示将
x
的整数除以
10
,然后将该值与
0
进行比较。如果达到
0
,则循环结束


顺便说一句:
length
1
开头,因为任何数字,即使是
0
,都至少包含一位数字

x/=10连续地将x除以10,这将使其最终为0,并导致while循环终止,因为0被解释为false(而0以外的任何其他值都被解释为true)

它以length=1开始的原因是因为数字中始终至少有1位数字:如果x是0到9(含9),那么x/=10将导致x立即变为0,这意味着循环中不会执行任何内容。因此,如果长度从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时停止


  • 这是在C/C++中经常看到的一点愚蠢,它利用了TRUE实现为非零,FALSE实现为零的事实*。所以x被反复除以10,表达式最终变成零,循环停止

    尽管令人困惑,但这是可行的——直到有一天有人匆忙地将x从int改为double:-)更清晰、更不容易出错地写“while(x/=10>=1)”,甚至将数学放在循环体中而不是条件中


    *我认为C语言的一个缺点是它没有像FORTRAN那样的显式逻辑类型。

    使用调试器逐步检查程序,并观察
    x
    变量的值。顺便说一句,
    /=
    的意思是
    x=x/10
    。顺便说一句:获取正数位数的一个更简单的方法是
    ceil(log10(x))
    @Dashwuff…当x时崩溃为什么这个问题偏离主题?@PeterMortensen我同意。给出的理由是离题的。OP没有要求关于书籍或工具等的建议。如果你把C++中不喜欢的内容保留在答案中,最好是……1)太过于固执己见。2) 绝对不限于C/C++,而是许多编程语言所共有的。3) 为了捕捉诸如“某人在匆忙中更改类型”(并且您永远不应该“在匆忙中”更改工作代码)之类的情况,我们正在编写和执行测试。4) 将逻辑压缩到这样的条件中,除了编程初学者之外,任何人都不会感到困惑。(接下来你会讨论关于零的索引……)5)问题是C++,不是C,C++有一个明确的逻辑类型(就像C99以来的C一样)。6)你的“修复”不适用于负数。7) 代码统计整数中未定义的位数
    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