关于C语言中"goto"的一些问题

Jus*_*oob -5 c printf goto

我有一些问题.这goto是我的代码:

int main(){ 
    int a = 1;
    if (a<0)
        goto out;
    out:
    printf("out");
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

问题是,无论价值如何a(例如:a=-1a=0),out都可以打印出来.
谁能告诉我原因,非常感谢你.

abh*_*aik 6

假设的价值a1,在这种情况下,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语句会破坏程序的正常流程,因此使用它被认为是一种不好的做法.


brw*_*w59 5

无论是否输入'if'语句,下一个语句都将是printf语句.

如果它跳过'if语句',则接下来打印printf,如果输入'if语句',则转到printf.无论哪种方式都会显示该语句.

'out'有点像程序集跟踪的索引.如果goto'out'不在那里,printf仍然会在那里,只是没有编译器跟踪的内存位置.