鱼C论坛

 找回密码
 立即注册
查看: 1093|回复: 13

[已解决]为什么给cnt赋值为零后就不能运行了。不赋值反倒是可以运行

[复制链接]
发表于 2023-8-11 09:37:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main(void)
{
        int a,b,c;
        int d;
        printf("输入一个分数:");
        scanf("%d/%d",&a,&b);
        printf("0.");
        //cnt=0;
        while(a!=0 && d<200)
        {
                c=a*10/b;
                a=a*10%b;
                d++;
                printf("%d",c);
                if(d==200)
                {
                        printf("\n");
                }
        }
       
        return 0;
}
最佳答案
2023-8-11 09:49:56
毛发怪 发表于 2023-8-11 09:45
#include
int main(void)
{

在C语言中,如果你没有给局部变量赋初始值,它的值是不确定的。在你的代码中,这个  cnt  变量并没有被赋予初始值,其实是一种不良的编程习惯,因为它的值其实是不可预期的,这可能导致程序表现得不一致、难以调试。

但是在你的这个例子中,由于你在  while  判断条件中同时检查了  a!=0 和  cnt<200 ,足够保证了程序不会无限循环下去。也就是说,只要  a  不为0或者  cnt  到达200,循环就会停止。即使在  cnt  的值非常大甚至是负数的情况下,由于你是在每次循环中增加  cnt  的值,那么在有限的循环中它总会到达200,这也就隐式的变相保证了你的程序不会无限循环。
然而,你的这个代码在含有bug的,应该为  cnt  赋一个初始值0。因为在一些编译器或运行环境下,如果你不为  cnt  赋初始值,它将很可能是一个很大的值或者是负数,这将会使你的程序表现出不可预期的行为。在其他情况下,如果  cnt  的起始值太大,你的程序可能会打印出200个以上的数字,这并不是你想要的结果。因此,即使你的程序在某些情况下可以正常运行,但是这仍然是一个严重的编程错误,需要为  cnt  赋一个初始值0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-11 09:37:33 | 显示全部楼层
根据你提供的代码来看,cnt 是未定义的变量。在 C 语言中,变量需要先声明并赋予一个初始值,然后才能使用。

如果你取消注释 //cnt=0; 这一行代码,那么代码中就会引用到 cnt 变量,由于它没有被声明,编译器将会报错,导致程序无法运行。

如果你想要给 cnt 赋值为零,并在程序中使用它,你需要先将其声明,如下所示:
int cnt = 0;  // 声明并初始化 cnt 变量为零

在你的代码中,由于 cnt 这个变量并没有在后续的循环或其他部分中使用,可以直接删除或注释掉这行代码。

希望以上解答能够帮助到你。如果你还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:37:35 | 显示全部楼层
问题出在变量d没有被初始化。在C语言中,未初始化的变量的值是不确定的,可能是任意值。因此,在while循环中,条件"a!=0 && d<200"可能会导致未定义的行为。

当你注释掉"//cnt=0;"这行代码时,变量d的初始值是未定义的,但是由于未使用变量d,程序仍然可以正常运行。

当你取消注释"cnt=0;"这行代码时,变量d被赋值为0。在while循环中,条件"d<200"始终为假,因此循环不会执行,导致程序提前结束。

为了解决这个问题,你应该在声明变量d时将其初始化为0,即将"int d;"改为"int d = 0;"。这样,变量d的初始值就是确定的,程序就可以正常运行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:40:55 | 显示全部楼层
isdkz 发表于 2023-8-11 09:37
问题出在变量d没有被初始化。在C语言中,未初始化的变量的值是不确定的,可能是任意值。因此,在while循环 ...

改了以后反倒是不行,没有给d赋初始值的情况下是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:42:03 | 显示全部楼层
陶远航 发表于 2023-8-11 09:37
根据你提供的代码来看,cnt 是未定义的变量。在 C 语言中,变量需要先声明并赋予一个初始值,然后才能使用 ...

赋值以后不行,没有赋值的时候是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:43:18 | 显示全部楼层
毛发怪 发表于 2023-8-11 09:40
改了以后反倒是不行,没有给d赋初始值的情况下是可以运行的

你赋值得先声明,你的 cnt 只是赋值没有声明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:45:39 | 显示全部楼层
isdkz 发表于 2023-8-11 09:43
你赋值得先声明,你的 cnt 只是赋值没有声明

#include <stdio.h>
int main(void)
{
        int a,b,c;
        int cnt;
        printf("输入一个分数:");
        scanf("%d/%d",&a,&b);
        printf("0.");
        //cnt=0;
        while(a!=0 && cnt<200)
        {
                c=a*10/b;
                a=a*10%b;
                cnt++;
                printf("%d",c);
                if(cnt==200)
                {
                        printf("\n");
                }
        }
       
        return 0;
}
我试了,还是在没有给cnt赋值的情况下才能正常运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:49:56 | 显示全部楼层    本楼为最佳答案   
毛发怪 发表于 2023-8-11 09:45
#include
int main(void)
{

在C语言中,如果你没有给局部变量赋初始值,它的值是不确定的。在你的代码中,这个  cnt  变量并没有被赋予初始值,其实是一种不良的编程习惯,因为它的值其实是不可预期的,这可能导致程序表现得不一致、难以调试。

但是在你的这个例子中,由于你在  while  判断条件中同时检查了  a!=0 和  cnt<200 ,足够保证了程序不会无限循环下去。也就是说,只要  a  不为0或者  cnt  到达200,循环就会停止。即使在  cnt  的值非常大甚至是负数的情况下,由于你是在每次循环中增加  cnt  的值,那么在有限的循环中它总会到达200,这也就隐式的变相保证了你的程序不会无限循环。
然而,你的这个代码在含有bug的,应该为  cnt  赋一个初始值0。因为在一些编译器或运行环境下,如果你不为  cnt  赋初始值,它将很可能是一个很大的值或者是负数,这将会使你的程序表现出不可预期的行为。在其他情况下,如果  cnt  的起始值太大,你的程序可能会打印出200个以上的数字,这并不是你想要的结果。因此,即使你的程序在某些情况下可以正常运行,但是这仍然是一个严重的编程错误,需要为  cnt  赋一个初始值0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-11 09:53:33 | 显示全部楼层
isdkz 发表于 2023-8-11 09:49
在C语言中,如果你没有给局部变量赋初始值,它的值是不确定的。在你的代码中,这个  cnt  变量并没有被赋 ...

我了解了,谢谢您的回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:56:12 | 显示全部楼层
毛发怪 发表于 2023-8-11 09:53
我了解了,谢谢您的回复

解决了可以把最佳答案给他
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:58:46 | 显示全部楼层
陶远航 发表于 2023-8-11 09:56
解决了可以把最佳答案给他

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 09:59:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 10:00:06 | 显示全部楼层

抵制ChatGPT脚本回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-11 10:03:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表