| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1936 人关注过本帖
标题:编译通过,但运行时出错
只看楼主 加入收藏
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:10 
编译通过,但运行时出错
程序代码:
#include<stdio.h>
int main()
{
    int m,n,i,j;
    printf("This is a program about greatest common divisor and least common multiple\n");
    scanf("%d%d",&m,&n);
    i=m;
    j=n;
    for(;(m%n)!=0;)
    {
        m=n;
        n=m%n;
    }
    printf("greatest common divisor is %d",m);
    printf("least common multiple is %d",(i*j)/m);
    return 0;
}
//我这是一个输出两个数的最大公约数和最小公倍数的程序,编译未报错,运行时输入数据回车后就出现如下错误 
上网搜说是程序崩溃,但不知道是什么原因,希望大家能帮我看下哪里出错,谢谢了
运行环境为win7下C-Free4.0
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 wssy213 于 2014-6-21 15:41 编辑 ]
2014-06-21 15:35
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
找到错误的地方了= =||

坚持----------------------------------唯一的道路
shit ! ! !
2014-06-21 15:55
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
我把m%n赋值给c,然后再用c作为循环判断条件,这样就没错了,但是有一个问题就是为什么不能直接用m%n做判断条件呢,这样没语法错误吧
希望大家帮忙解惑

坚持----------------------------------唯一的道路
shit ! ! !
2014-06-21 16:00
外部三电铃
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:那一年
等 级:贵宾
威 望:57
帖 子:2012
专家分:7306
注 册:2007-12-17
收藏
得分:10 
程序代码:
for(;(m%n)!=0;)
{
    m=n; //这两行在运算过程中改变了上面m、n的值
    n=m%n;
}

那一年,苍井空还是处女
2014-06-21 16:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
    for(;(m%n)!=0;)
    {
        m=n;
        n=m%n;
    }

你循环里第一行,把n赋值给m,那么第二行的m%n就是把n%n的结果赋值给n,那是多少?然后用这个结果到循环条件运算会怎样?

授人以渔,不授人以鱼。
2014-06-21 16:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果你不知道怎么排查错误,不要乱猜,用下面的方法:

    for(;(m%n)!=0;)
    {
        m=n;
        n=m%n;
        printf("m = %d, n = %d", m, n);
    }

运行时,崩溃前就会看到m,n的值分别是多少。找到错误原因后,可以把那行删掉或注释掉,也可以用宏条件编译区分调试版代码和最终版代码。

[ 本帖最后由 TonyDeng 于 2014-6-21 16:22 编辑 ]

授人以渔,不授人以鱼。
2014-06-21 16:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实,做过那个交换两数据的题目的,都遇到过这类问题啦。

授人以渔,不授人以鱼。
2014-06-21 16:23
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
恩,懂了,谢谢,本来打算是另外一个变量来储存的,但后来想到好像能够不用,结果就没考虑到这了

坚持----------------------------------唯一的道路
shit ! ! !
2014-06-21 16:24
wssy213
Rank: 12Rank: 12Rank: 12
来 自:湖南
等 级:贵宾
威 望:10
帖 子:967
专家分:3703
注 册:2014-6-6
收藏
得分:0 
恩,在交换数据时乱减少使用的变量确实会导致问题

坚持----------------------------------唯一的道路
shit ! ! !
2014-06-21 16:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用wssy213在2014-6-21 16:26:26的发言:

恩,在交换数据时乱减少使用的变量确实会导致问题

不需要刻意去省变量,那占用不了多少内存(自动变量的空间在栈内,很快就回收的),而且赋值语句也不消耗多少执行效率(几乎是速度最快的操作,因为编译器和运行时库都可能在恰当的时候使用寄存器,操作在CPU内部),最根本的原因是,这种完全可以忽略的小消耗无助于程序优化以及不起显著作用(最有效的优化是修改算法而不是靠这类小技巧)。所以,为了正确性,不要在节省空间和时间上过分执着——先做对再做快。一开始学习就把精力放在这种细微优化上,是误区,不出错也就罢了,何况出错了呢,这就是不必要的出错。

授人以渔,不授人以鱼。
2014-06-21 17:37
快速回复:编译通过,但运行时出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019506 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved