首页 > 解决方案 > 为什么这段代码每次都冻结?

问题描述

// program to check if a number is a perfect square or not.
#include<stdio.h>
    
    double perfect_square(double number)
    {
        step:
        for (int i = 1; i<=number; i++)
        {
            if (i*i == number)
            {
                return number;
            }
            else
            {
               goto step;
            }
    
        }
        return 0;
    }
    
    int main ()
    {
        double N;
        printf("Enter a number: ");
        scanf("%lf", &N);
        double cube_decision = perfect_square(N);
        if (cube_decision == 0)
        {
            printf("It is not a perfect cube");
        }
        else 
        printf("It is a perfect cube."); 
        return 0;
    }

上面的程序让我输入一个数字,但我只是冻结并且没有做任何事情。我尝试用 int 变量替换每个double变量并使函数返回int 类型并且它工作但我的问题是为什么这个程序在我使用 double 时突然冻结???

标签: cdebuggingcrash

解决方案


因为如果条件i*i == number为假,那么您将重新开始循环,从头开始(与int i = 1零件一起)。goto会给你一个无限循环。

你不需要goto这里,无论如何循环都会自动迭代:

double perfect_square(double number)
{
    for (int i = 1; i<=number; i++)
    {
        if (i*i == number)
        {
            return number;
        }
    }
    return 0;
}

作为一般规则,永远不要使用goto和标签。


推荐阅读