我对goto
有疑问。这是我的代码:
int main(){
int a = 1;
if (a<0)
goto out;
out:
printf("out");
return 1;
}
问题是, a
的值是什么(例如: a=-1
或 a=0
),可以打印 out
谁能告诉我原因,非常感谢你。
答案 0 :(得分:6)
假设a
的值为1
,在这种情况下,a<0
为false,因此跳过if语句goto out;
并且程序恢复顺序执行。下一个陈述显然是:
out:
printf("out");
请注意out:
只是一个标签,因此执行printf()
语句。因此,打印out
,因为它是执行程序的下一个连续步骤(而不是因为if
条件为真)。
如果a
的值是-1
,在这种情况下a<0
为真,那么执行if语句goto out;
并且控件转到:
out:
printf("out");
因此,在这两种情况下,都会打印out
。
为了更好地理解,请考虑以下示例:
#include <cstdio>
int main(){
int a = -1;
if (a<0)
goto in;
out:
printf("out");
in:
printf("in");
return 0;
}
此处,由于a
的值为-1
,因此a<0
为真,因此会执行goto in;
。这将控制执行到以下语句:
in:
printf("in");
因此,上述代码段的输出为in
。
上述代码的实时演示为here。
P.S。:使用goto语句会破坏normal flow of the program,因此使用它被认为是一种不好的做法。
答案 1 :(得分:5)
无论是否&#39;如果&#39;是否输入了语句,下一个语句将是printf语句。
如果它跳过&#39; if语句&#39;,则接下来会出现printf,如果&#39; if语句&#39;输入,然后转到printf。无论哪种方式,都会显示该语句。
&#39; out&#39;有点像组件跟踪的索引。如果goto&#39; out&#39;不存在,printf仍然存在,只是没有编译器跟踪的内存位置。
答案 2 :(得分:4)
如果&lt; 0.你点击goto,它会带你到标记的代码。如果a> = 0,则跳过goto ...但是下一行是标记的代码,无论如何。当goto将执行路径带到那里时,标记的代码不会被执行。
答案 3 :(得分:2)
首先,你应该尽可能避免使用goto
。
您可能想要一个if else
或至少一个括号if
int main(){
int a = 1;
if (a<0){
printf("out");
}
}
OR
int main(){
int a = 1;
if (a<0){
printf("out");
}
else {
print("in");
}
return 1;
}
答案 4 :(得分:2)
goto
可以执行两种类型的跳转。
1 - &gt;向前跳跃
2 - &gt;向后跳
您可以尝试以下程序:
#include<conio.h>
#include<stdio.h>
#include<stdio.h>
main()
{
int i=1;
goto x;
y:
printf("This is the 1st goto statement\n");
goto z;
x:
if(i==1)
{
printf("This is the 2nd goto statement\n");
goto y;
}
z:
printf("End of the program\n");
}
注意:虽然我同意这在知识观点上已经足够好了,但我强烈建议您不要使用 goto
语句,因为它是非常糟糕的编程习惯。另请注意Problems that can arise from using a GOTO statement to jump down only?链接,该链接对goto
声明的使用存在争议。
答案 5 :(得分:1)
int main(){
int a = 1; // 1
if (a<0) // 2
goto out; // 3
out: // 4
printf("out"); // 5
return 1;
}
执行代码时,会从上到下执行。当插入诸如条件(if-else,switch case),循环(while,for)或其他特殊语句(如你的goto)之类的代码时,代码可以有间接流,这意味着它有时会偏离主路径。
现在,如果你看看没有第2-4行的代码,你会得到一个简单的printf代码。如果你添加这些行,你会得到一个新的代码执行选项 - 如果(a&lt; 0)为真,那么PC将移动到你指向它的地方,而不是向下移动,否则就会发生。
你的代码总是转到printf的原因很简单:if(a&lt; 0)如果是,则“goto”将PC发送到printf。否则,代码的标准流程将把PC发送到那里。
如其他答案中所述,如果您在(a> 0)为假时想要避免使用printf,则可以使用:
int main(){
int a = 1;
if (a<0)
printf("out");
/* else
printf("in"); */
return 1;
}
最后注意:使用goto被认为是错误的,因为......好吧,因为它说here(它会导致意大利面条代码)