为什么用goto语句调用子函数时会报错?

Python018

为什么用goto语句调用子函数时会报错?,第1张

要知道 C语言是由MAIN函数开始也由它结束。

每调用一次分函数,只要运行完毕后就会回到调用分函数的地方继续往后执行。

C语言主要靠函数调用和return在函数之间切换,很难做到在多层调用中直接返回主函数。虽然goto语句可以无条件跳转,但是必须在同一个函数中使用。

因此解决的方法也是用一个特殊的值作为需要返回的标志,然后在两层调用函数中都遇到该值就返回,但是这个方法也有两个前提:

1)你的两个子函数都是由返回值的函数

2)你选择的特殊值和函数正常的返回的取值不会冲突,不会引起二义性。

同样的操作,C++可以通过异常处理的throw和catch来实现从子函数的子函数直接返回主函数,汇编语言可以用jmp指令跳转实现这个需求。因此建议你的这个问题还是用C++ 的异常去解决比较好。

看不清楚你上传的图片啊,我来给你详细介绍一下goto语句的使用:

例如一下:

int main(void)

{

while(1)

{

i++

P0 = i

if(i == 8)

{

i = 0

goto Error // 跳转到Error

}

Error: //goto跳转到Error标签位置

P0 = 0xFF

}

}

goto语句称为无条件转移语句,通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。而且,goto语句一般可以用其他语句来代替。

当然,goto语句也有其优势,例如可以用goto语句一次性跳出多重循环,而不需要使用多个break语句一步一步地跳出,从而使代码更为简洁。

在C语言中使用goto语句的注意事项如下:

使用goto语句只能转移到到同一函数内,而不能从一个函数里转移到另外一个函数里。

使用goto语句在同一函数内进行转移时,转移的起点应是函数内一段小功能的结束处,goto的目的label处应是函数内另外一段小功能的开始处。

不能从一段复杂的执行状态中的位置goto到另外一个位置,比如,从多重嵌套的循环判断中跳出去就是不允许的。

应该避免向两个方向跳转。这样最容易导致“面条代码”。

所以说,goto语句要小心使用。