| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1270 人关注过本帖
标题:新人问题:C语言中goto的用法
只看楼主 加入收藏
cy_guo
Rank: 1
等 级:禁止访问
帖 子:6
专家分:0
注 册:2015-11-4
结帖率:0
收藏
已结贴  问题点数:10 回复次数:26 
新人问题:C语言中goto的用法
我以前用过批处理中的goto,定义标签段,然后goto标签名就可以了,C语言中不是这样吗。
这个程序是C语言入门经典中的一个作业,程序的功能是输入一个算式,计算出结果后,提示用户是结束还是返回继续下一个运算。
计算部分差不多实现了,但是那个goto跳转有问题,求帮看一下。

程序代码:
//练习1
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int system(const char *string); //清屏的函数声明,包含在stdlib.h

int main ()
{

    double a = 0, b = 0;
    long int long_a, long_b;
    char c ;
_calc:   //calc标签
    printf("请输入一个加减乘除或取模的运算,在各元素之间加一个空格,例如:\n100 + 100\n");
    scanf("%lf %c %lf",&a, &c, &b);
    long_a = int(a); //转换成long int型
    long_b = int(b);
    switch(c)
    {
        case '+':
            system("cls"); //调用函数清屏
            printf("%lf %c %lf = %lf",a, c, b,a + b );
            break;
        case '-':
            system("cls"); 
            printf("%lf %c %lf = %lf",a, c, b,a - b );
            break;
        case '*':
            system("cls"); 
            printf("%lf %c %lf = %lf",a, c, b,a * b );
            break;
        case '/':
            if(b == 0) 
            {
                printf("除数不能为0");
                break;
            }
            else if(a - long_a == 0 ) //这里用double型a减去强制转换成整数的a判断其是否为整数,如果为整数则输出的结果用整数商+余数的形式
            {
                system("cls"); 

                printf("\n%d %c %d = %d 余 %d",long_a, c, long_b, long_a / long_b,long_a % long_b);
                break;
            }
            else 
            {
                system("cls"); 
                printf("%lf %c %lf = %lf",a, c, b,a / b );
                 break;
            }

        case '%':
            if(a - long_a == 0)// 因为只能是整数才能求余,故这里判断被除数是否为整数
            {
                if(b - long_b == 0 && b != 0)//判断除数是否为整数和是否为0
                {
                    system("cls");
                    printf("%d %c %d = %d",long_a, c, long_b,long_a % long_b );
                    break;
                }
                else printf("求余时除数不能为浮点数也不可为0");
                break;
            }
                
            else printf("被除数不能为浮点数");
            break;            
        default:
            break;
    }
     

    printf("\n返回请按y,退出请按其他任意键\n");
    scanf("%c",&c);
    if (c == 'y' || c == 'Y')
    {
        system("cls");
        goto _calc; //在这里跳转到标签
        //问题处:不能跳转到标签
    }
    //else 
       // exit;

    getch();
    return 0 ;


}





[此贴子已经被作者于2015-11-5 16:19编辑过]

搜索更多相关主题的帖子: include C语言 标签 经典 
2015-11-04 23:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
標簽的冒號放在前面。結構化編程語言不鼓勵用goto語句,謹慎!

授人以渔,不授人以鱼。
2015-11-05 00:05
cy_guo
Rank: 1
等 级:禁止访问
帖 子:6
专家分:0
注 册:2015-11-4
收藏
得分:0 
回复 2楼 TonyDeng
我在百度搜了一下,我看他们的示例都是放在后面的。
放在前面我刚才试了,也不行。
2015-11-05 08:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你else那句語法是錯的。一直都不說有什麽問題,誰知道你改哪裏沒改哪裏出了什麽問題。

授人以渔,不授人以鱼。
2015-11-05 09:45
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:3 
适当的goto应该可以让代码的结构变清晰高效。我见过最漂亮的goto用法是glib库里面的base64的解码:
代码大概是这样的,
程序代码:
encode(const void *input, size_t len, void *output, int *lastst)
{
  int c1, c2, c3;
  switch(((char*)lastst)[0])
    {
    case 1: c1 = ((char*)lastst)[1]; goto skip1;
    case 2: c1 = ((char*)lastst)[1]; 
            c2 = ((char*)lastst)[2]; goto skip2;
    }

  while (intput < input_last)
    {
      c1 = *input++;
    skip1:
      c2 = *input++;
    skip2:
      c3 = *input++;
      ...
    }
}

每次输入长度不是3的倍数,将剩下的数据保留在lastst,以便下次再重新计算。
2015-11-05 11:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
關鍵是適度。需要用到goto的情景很少,適度也不容易。語言保留了這種語句,自然不是說絕對禁止。其實那種跳進循環是大忌,跳出倒是不錯,減少了代碼量而已,不見得邏輯很清晰。

[此贴子已经被作者于2015-11-5 11:21编辑过]


授人以渔,不授人以鱼。
2015-11-05 11:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
2樓是我寫錯了,標簽的冒號在後。代碼的問題在else exit;

授人以渔,不授人以鱼。
2015-11-05 11:23
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
其实也不少,最常用的还是错误处理,不知道平常T版是怎么处理错误的,我一般是基本上所有可能的错误都会去处理,并且出错了都会输出一条日志或者trace.这种情况下,一般把所有的错误处理代码都放到函数的最后面。比如
 if (err1) goto LABEL_err1;
 if (err2) goto LABEL_err2;
  ...

  return OK;

LABEL_err2: LOG("err2");
LABEL_err1: LOG("err1");
  return FAIL;


在我看来,不管C,C++,JAVA都是没有区别的,catch ... try 的代码看起来不那么紧凑,并且这3个语言没有太大差别。

[此贴子已经被作者于2015-11-5 11:30编辑过]

2015-11-05 11:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
像樓主這種情形,放一個循環就可以解決的,不用goto。本來就是重複做事,符合循環邏輯,跳轉幹嘛。

授人以渔,不授人以鱼。
2015-11-05 11:28
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
楼主的这个代码确实没必要用goto,循环加个控制条件就可以了。
2015-11-05 11:32
快速回复:新人问题:C语言中goto的用法
数据加载中...
 
   



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

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