C语言中的goto语句。为什么老师反复强调不能用
不是不能用,而是说如果用的不恰当,就很容易出现“面条代码”(结构混乱,难以理解)。
在大学期间学习C的时候,老师讲过一个很典型的例子:
#include <stdio.h>
(图片来自网络侵删)void main()
{
int a=1,b=2;
if(a<b)
goto aa;
printf("hello");
aa:printf("s");
return 0;
}输出结果:s
将上面的代码改一下:
int a=1,b=2;
if(a>b)
goto aa;
printf("hello");
aa:printf("s");
return 0;输出结果:hellos
现在发现问题了吗?aa:将没有意义。
这就是为什么要慎用goto语句的原因:goto语句太灵活了,可以不受>限定/p>
goto还是要慎用
首先,因为goto语句非常灵活,可以无条件跳转到其他标签,这就严重破坏了代码的结构性;其次,goto语句的执行可能会跳过变量的初始化、重要的计算语句等,这将直接影响到整个程序的运行。比方我们上面提到的例子,这些代码很简单,所以找问题时也很容易。但如果是实际项目,面对着几万行密密麻麻的代码,换谁都得疯。
所以我个人建议,除非是精通C语言的大神,否则还是别用goto了吧,老老实实的用while循环不好吗?
当你的规模比较庞大的时候你就能体会到goto的强大了,它可以强大到你怀疑人生,自己从哪里来要去哪里这个哲学问题会让你崩溃到让你想投胎回炉重造。goto一时爽,项目火葬场。被review到你就等着人事找你办理离职手续。
谈goto色变,主要是goto太自由了,甚至比汇编语言的jump更自由,jump还要考虑长地址短地址等跳转,而goto根本没有任何限制,他可以直接从函数内部调到函数外部甚至其它函数的位置。这就牵扯到一个问题,我们都知道函数调用是保护当前上下文,也是当前执行堆栈和寄存器,一旦进入被调用函数的内部,堆栈和寄存器就全变了,如果函数内部再用goto到其它地方函数不再返回,程序肯定就全乱了,而且导致内存泄露。所以,使用goto必须要加限制条件1.函数内部goto只能goto到函数内部,保证函数能够返回到被调用的2.中断内部用goto也是一样,goto必须要能够保证中断正常返回,不然也会导致中断异常。总结,goto不推荐使用的原因主要是它可以不受任何条件限制,跳转到你想要去执行的地方,过于自由,但是是好事还是坏事取决于程序开发人员的设计是不是考虑得完善,是不是会导致这样那样的问题。
怎么分辨“介词to”和“不定式to”
以下是小编的解答,欢迎点赞、评论和转发,期待与您共同进步!
to作为介词:后面只可能是“名词性”的词
这些短语中to是介词,后面的动作行为,只能用“动名词”(-ing)形式。
● look forward to >等待/p>
● be close to >靠近/p>
● be used to / get used to 习惯于
● prefer A to B 更喜欢A而不是B
to作为不定式符号,后面只可能是动词>本相/span>
这些短语中to是不定式符号,后面的动作行为,用动词原形。
● used to do 过去>经常/p>
● prefer to do 更喜欢一件事
如:
We used to play football in that park.
我们过去常在那个公园踢足球。
We have got used to playing football on the beach .
我们已经习惯在海滩上踢足球了。
I prefer to stay at home.
我更喜欢呆在家里。
I prefer staying at home to going shopping with my wife.
我宁愿呆在家里也不愿意和妻子一起去购物。
什么时候使用不带to的不定式
如:
You’d better to(省略) stop it.
你最好停止它。
Electricity makes machines to(省略) run.
电使机器运转
I saw your boys to(省略) play football yesterday.
昨天我看见你的孩子们踢足球了。