0

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

3 回答 3

3

来自 C 标准(6.7.9 初始化)

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

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

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

如果您将声明变量,例如

static int digits;

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

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

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

do
{
    digits++;
} while ( nc /= 10 );
于 2021-10-14T18:15:00.317 回答
1

我假设您对 C 很陌生。

也许它确实有助于查看不同类型的变量存储在内存中的哪个位置。局部变量,在函数中创建的变量(例如在您的情况下),始终在程序堆栈中分配内存。但是,没有真正的指导方针可以保证您的程序将堆栈清零。这意味着,当您创建局部变量时,它会在堆栈中分配内存,并且该内存空间可以是非零值。然后,当您打印该整数(不分配它)时,您将看到之前存储在同一内存地址的内容。

因此,当您未定义某个值时,不能保证该值为 0。

你可以在这里了解更多。

于 2021-10-14T18:16:46.873 回答
0

...因为默认情况下它是 0

False,对于本地(自动持续时间)变量。

所以,我的问题:是否有必要在用户定义函数中为变量赋值?

是的。

如果是,为什么?

因为否则它们会以不可预测的值开始,使您的代码不可靠和损坏。

另请参阅此答案

于 2021-10-14T18:25:11.433 回答