C语言"goto"的一些问题
Some questions about "goto" in C language
我有一些关于 goto
的问题。这是我的代码:
int main(){
int a = 1;
if (a<0)
goto out;
out:
printf("out");
return 1;
}
问题是,无论值 a
是什么(例如:a=-1
或 a=0
), 可以打印 out
.
谁能告诉我原因,万分感谢
假设 a
的值为 1
,在这种情况下,a<0
为假,因此跳过 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,因此使用它被认为是一种不好的做法。
首先,你应该尽可能避免使用goto
。
您可能需要一个 if else
或至少一个带括号的 if
int main(){
int a = 1;
if (a<0){
printf("out");
}
}
或
int main(){
int a = 1;
if (a<0){
printf("out");
}
else {
print("in");
}
return 1;
}
无论是否输入'if'语句,下一条语句都是printf语句。
如果它跳过 'if statement',接下来会出现 printf,如果输入 'if statement',那么它会转到 printf。无论哪种方式,该语句都会显示。
'out' 有点像程序集跟踪的索引。如果 goto 'out' 不存在,printf 仍会存在,只是没有编译器跟踪的内存位置。
如果 a < 0. 您点击了 goto,它会将您带到带标签的代码。如果 a >= 0,则跳过 goto... 但无论如何,下一行是带标签的代码。当 goto 将执行路径带到那里时,标记的代码不会 - 仅 - 得到执行。
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<0) 为真,则 PC 将移动到您指向的位置,而不是向下移动,否则会向下移动。
您的代码总是转到 printf 的原因很简单:如果 (a<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(它会导致意大利面条代码)
goto
可以执行两种类型的跳跃。
1 --> 向前跳跃
2 --> 向后跳跃
您可以尝试以下程序:
#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
语句,因为这是一种非常糟糕的编程习惯。另请阅读 link Problems that can arise from using a GOTO statement to jump down only?,其中对 goto
语句的使用有一些争论。
我有一些关于 goto
的问题。这是我的代码:
int main(){
int a = 1;
if (a<0)
goto out;
out:
printf("out");
return 1;
}
问题是,无论值 a
是什么(例如:a=-1
或 a=0
), 可以打印 out
.
谁能告诉我原因,万分感谢
假设 a
的值为 1
,在这种情况下,a<0
为假,因此跳过 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,因此使用它被认为是一种不好的做法。
首先,你应该尽可能避免使用goto
。
您可能需要一个 if else
或至少一个带括号的 if
int main(){
int a = 1;
if (a<0){
printf("out");
}
}
或
int main(){
int a = 1;
if (a<0){
printf("out");
}
else {
print("in");
}
return 1;
}
无论是否输入'if'语句,下一条语句都是printf语句。
如果它跳过 'if statement',接下来会出现 printf,如果输入 'if statement',那么它会转到 printf。无论哪种方式,该语句都会显示。
'out' 有点像程序集跟踪的索引。如果 goto 'out' 不存在,printf 仍会存在,只是没有编译器跟踪的内存位置。
如果 a < 0. 您点击了 goto,它会将您带到带标签的代码。如果 a >= 0,则跳过 goto... 但无论如何,下一行是带标签的代码。当 goto 将执行路径带到那里时,标记的代码不会 - 仅 - 得到执行。
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<0) 为真,则 PC 将移动到您指向的位置,而不是向下移动,否则会向下移动。
您的代码总是转到 printf 的原因很简单:如果 (a<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(它会导致意大利面条代码)
goto
可以执行两种类型的跳跃。
1 --> 向前跳跃
2 --> 向后跳跃
您可以尝试以下程序:
#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
语句,因为这是一种非常糟糕的编程习惯。另请阅读 link Problems that can arise from using a GOTO statement to jump down only?,其中对 goto
语句的使用有一些争论。