c - 我们是否总是必须为函数中的变量分配初始值?
问题描述
在numberOfDigits
函数中,我没有为digits
变量赋值,因为默认情况下它是 0。但是在变量的printf
语句中digits
它被打印为 168。
digits
将零分配给变量后,我得到了预期的输出。所以,我的问题:是否有必要在用户定义函数中为变量赋值?如果是,为什么?
#include <stdio.h>
void numberOfDigits(int num);
void main()
{
int num;
printf("Enter integer :");
scanf("%d",&num);
numberOfDigits(num);
}
void numberOfDigits(int num)
{
int nc=num, digits=0;
while(nc>0)
{
nc=nc/10;
digits++;
}
printf("Number of digits in %d are %d\n",num,digits);
}
解决方案
来自 C 标准(6.7.9 初始化)
10如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
在函数内numberOfDigits
,变量digits
具有自动存储持续时间,因为它是在没有存储类说明符的情况下(在块范围内)声明的。因此,如果它没有显式初始化,那么它的值是不确定的。并且应用增量运算符会导致未定义的行为。
如果您将声明变量,例如
static int digits;
那么它将被零初始化(仅一次)。
请注意该功能有错误。如果用户将传递给函数零(0),则该函数将报告该数字有 0 位,尽管它有一位等于 0。
您需要将 while 循环替换为如下所示的 do while 循环
do
{
digits++;
} while ( nc /= 10 );
推荐阅读
- rust - 无法解决“https://github.com/rust-lang/crates.io-index”的补丁
- python - 焊接路径优化 - Python
- bash - Shell 脚本 grep 结果组(按文件位置)
- javascript - 如何设置和获取cookies
- c - 返回一个字符串数组并将其分配给 C 中的一个变量
- c# - 恢复动态资源值
- cpu - 总是收到“在‘首选’模式下调整NUMA内存只支持单节点”的错误报告
- gradle - Gradle,Java 8 和 9+,变体感知示例
- c++ - Visual Studio 中的 find_package()-ing 未发现包含目录
- ios - Xcode 11“iphone 很忙:让 iphone 为开发做好准备”