我想创建一个程序,该程序将使用goto语句而不是循环来计算阶乘,而问题是为什么goto'阶乘'在'阶乘:'之前重复scanf?

此代码中出现问题:

int main(void) {

    int number;
    double n;

    scanf("%d", &number);
    n = number;

    factorial:
                if (number > 1) {
                    --number;
                    n *= number;
                }
                goto factorial;

    printf("n! = %f", n);

    return 0;
    }


当我将goto factorial放入if语句中时,一切工作正常:

int main(void) {

int number;
double n;

scanf("%d", &number);
n = number;

factorial:
            if (number > 1) {
                --number;
                n *= number;
                goto factorial;
            }

printf("n! = %f", n);

return 0;
}

最佳答案

此代码段

factorial:
            if (number > 1) {
                --number;
                n *= number;
            }
            goto factorial;


产生无限循环。您可以通过以下方式想象

factorial:
            // some calculations
            goto factorial;


在此代码段中

factorial:
            if (number > 1) {
                --number;
                n *= number;
                goto factorial;
            }


仅当number大于1时,才执行goto语句。因此,一旦number等于0,控制即被传递到if语句之外,并相应地绕过goto语句。

关于c - 为什么goto'label'在'label:'之前重复该语句?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57159617/

10-12 12:54
查看更多