永发信息网

为什么c++中goto语句不好用

答案:2  悬赏:30  手机版
解决时间 2021-02-08 03:11
  • 提问者网友:心牵心
  • 2021-02-07 05:35
#include "squeue.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
SqQueue b,r;

int buffer[10],in=0,out=0;
sign m,full,empty;

void main()
{void block();
void wakeup();
void wait();
void signal();
void produce(char);
void cust(char);
char a[10],p;

m.value=1;
full.value=0;
empty.value=10;
int i=0,in=0,out=0;
Bq(b);
Bq(r);
qq(m);
qq(full);
qq(empty);

gets(a);
while(a[i]!=0)
{
EnQu(r,a[i]);
i++;
}

loop:
while(!(QueueLenght(r)==0))
{
OuQu(r,p);
if(p=='p')

produce(p);

else if (p=='c')

cust(p);

}

}
void block(char p)
{

EnQu(b,p);
goto loop;

}
void wakeup(char p)
{

OuQu(b,p);
EnQu(r,p);

}
void wait(sign s,char p)
{ s.value--;
if(s.value<0)
{
EnQu(s.queue,p);
}
block(p);
}
void signal(sign s)
{ char p;
++s.value;
if(s.value<=0)
{
OuQu(s.queue,p);
wakeup(p);
}

}
void produce(char p)
{
wait(empty,p);
wait(m,p);
buffer[in]=0;
in=(in+1)%10;
signal(m);
signal(full);

}
void cust(char p)
{
int n;
wait(full,p);
wait(m,p);
n=buffer[out];
out=(out+1)%10;
printf("%d",empty.value);
signal(m);
signal(empty);
}
错误:

C:\Documents and Settings\Administrator\桌面\pro\a.cpp(39) : warning C4102: 'loop' : unreferenced label
C:\Documents and Settings\Administrator\桌面\pro\a.cpp(64) : error C2094: label 'loop' was undefined
最佳答案
  • 五星知识达人网友:不想翻身的咸鱼
  • 2021-02-07 06:21
goto的跳转点只能在函数内部定义并且在函数内部跳转,不是文件范围的,不能从一个函数跳到另一个函数

如果你要实现函数间跳转,用setjmp和longjmp,但是这2个函数一般用来除错,用来倒退堆栈的,正常情况下一般不用,会严重破坏程序的结构性
全部回答
  • 1楼网友:青灯有味
  • 2021-02-07 06:52

lz 这是以前的一种用法

现在 随着c/c++ 的标准修改 已经不常用这个语法 了 因为这样会导致代码的读取顺序不方便 容易混乱,在老潭的书上也明确规定

由于goto语句能直接跳到程序的某一处开始执行,因此会导致许多不易差距的错误,并且使程序结构看上去不那么严密,松散很多。 少用

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯