我有一些问题.这goto是我的代码:
int main(){
int a = 1;
if (a<0)
goto out;
out:
printf("out");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
问题是,无论价值如何a(例如:a=-1或a=0),out都可以打印出来.
谁能告诉我原因,非常感谢你.
假设的价值a是1,在这种情况下,a<0是假的,所以if语句goto out;被跳过,程序恢复顺序执行.下一个陈述显然是:
out:
printf("out");
Run Code Online (Sandbox Code Playgroud)
请注意,这out:只是一个标签,因此printf()执行该语句.因此,out打印,只是因为它是程序执行中的下一个连续步骤(而不是因为if条件为真).
如果值a是,例如-1,在哪种情况下a<0为真,那么执行if语句goto out;并且控件转到:
out:
printf("out");
Run Code Online (Sandbox Code Playgroud)
因此在这两种情况下out都是印刷的.
要更好地理解,请考虑以下示例:
#include <cstdio>
int main(){
int a = -1;
if (a<0)
goto in;
out:
printf("out");
in:
printf("in");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,由于价值a就是-1,a<0将是真正的,因此,goto in;将被执行.这将控制执行到以下语句:
in:
printf("in");
Run Code Online (Sandbox Code Playgroud)
因此,上面的代码片段的输出是in.
上面代码的现场演示就在这里.
PS:使用goto语句会破坏程序的正常流程,因此使用它被认为是一种不好的做法.
无论是否输入'if'语句,下一个语句都将是printf语句.
如果它跳过'if语句',则接下来打印printf,如果输入'if语句',则转到printf.无论哪种方式都会显示该语句.
'out'有点像程序集跟踪的索引.如果goto'out'不在那里,printf仍然会在那里,只是没有编译器跟踪的内存位置.