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