我写了一些代码来计算单词中的位数。当我printf()计数时,它按预期打印32,但是当我将相同的代码插入函数并打印返回值时,它给了我一些疯狂的大数字。
然后,我将代码复制/粘贴回main()中,同时打印计数并打印函数的返回值,并且两者都给了我32,但是如果我在main()函数中注释掉代码,再次打印大号。
有人知道为什么会发生这种事吗?
#include <stdio.h>
int wordlength();
int main() {
printf("%d", wordlength()); // prints 4195424 but
// if I uncomment the code below
// it then prints 32 like I want
// int count;
// unsigned int n = ~0;
//
// while( n != 0) {
// n = n >> 1;
// count++;
// }
// printf("\n%d", count); // prints 32 as expected
return 0;
}
int wordlength() {
int count;
unsigned int n = ~0;
while( n != 0) {
n = n >> 1;
count++;
}
return count;
}发布于 2015-09-25 05:30:03
在wordlength()函数中,count是一个自动局部变量,没有显式初始化。因此,初始值是不确定的。
引用C11标准,第6.7.9章
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。..。
你很容易就能在上面申请加薪了。它调用未定义行为。
相关的,附件J.2节,行为不明的原因,
具有自动存储持续时间的对象的值是在不确定时使用的。
因此,您的程序显示UB,并且根本不保证产生任何有效的结果。
解决方案:将count初始化为0。
FWIW,关于评论
//如果我取消下面的代码注释 //然后按我想要的方式打印32
也是UB的结果。
发布于 2015-09-25 05:29:44
您必须将count初始化为0或其他东西,否则它将具有未定义的值。
https://stackoverflow.com/questions/32775412
复制相似问题