首页 > 解决方案 > 我们是否总是必须为函数中的变量分配初始值?

问题描述

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);   
}

标签: cwhile-loopinitializationdo-whilestorage-duration

解决方案


来自 C 标准(6.7.9 初始化)

10如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储持续时间的对象未显式初始化,则:

— 如果它具有算术类型,则将其初始化为(正或无符号)零;

在函数内numberOfDigits,变量digits具有自动存储持续时间,因为它是在没有存储类说明符的情况下(在块范围内)声明的。因此,如果它没有显式初始化,那么它的值是不确定的。并且应用增量运算符会导致未定义的行为。

如果您将声明变量,例如

static int digits;

那么它将被零初始化(仅一次)。

请注意该功能有错误。如果用户将传递给函数零(0),则该函数将报告该数字有 0 位,尽管它有一位等于 0。

您需要将 while 循环替换为如下所示的 do while 循环

do
{
    digits++;
} while ( nc /= 10 );

推荐阅读