为啥for循环在c中无限进行

Posted

技术标签:

【中文标题】为啥for循环在c中无限进行【英文标题】:why is the for loop going on infinitely in c为什么for循环在c中无限进行 【发布时间】:2021-07-08 19:52:48 【问题描述】:

我的问题是当我运行代码时,循环会无限进行。预期的输出是打印 hi 5 次然后转到新行并打印 4 次 3 等等我无法理解是什么导致循环无限。

#include <stdio.h>
int star(int);
int main()

    printf("enter number\n");
    int a;
    scanf("%d", &a);
    star(a);
    return 0;


int star(int m)


    int n;
    for (n = 0; n < m; n++)
    
        printf("hi");
    
    printf("\n");

    star(m - 1);

    return 0;

【问题讨论】:

你有没有终止条件的递归。 我..看看你的代码。 star 什么时候会不再自称? 我如何在 c 初学者中添加终止条件 取决于你想要做什么。 您可能想以if (m &lt; 0) return 0; 之类的开头star 或使用if(m &gt; 0) star(m-1); 保护star(m-1);。这样,一旦 m 变为负数,它就不会继续调用自己。 【参考方案1】:

您忘记检查函数中某处是否 m > 0。在这种情况下,循环会无限循环,因为它没有办法摆脱递归。

简单修复:

#include <stdio.h>
int star(int);
int main()

    printf("enter number\n");
    int a;
    scanf("%d", &a);
    star(a);
    return 0;


int star(int m)


    int n;
    for (n = 0; n < m; n++)
    
        printf("hi");
    
    printf("\n");
    if (m > 0)
        star(m - 1);
    
    return 0;

【讨论】:

我现在明白了,感谢您的帮助【参考方案2】:

对于初学者来说,函数star 的返回类型是无用的,没有任何意义。此外,将参数声明为有符号整数类型int 也没有什么意义。将参数声明为至少具有无符号整数类型unsigned int 在逻辑上更正确。

所以函数应该这样声明

void star( unsigned int n );

函数无限递归调用自身,因为这样的调用是无条件的,不依赖于参数m的值。

int star(int m)

    //...
    star(m - 1);
   
    return 0;

该函数可以通过以下方式定义,如下面的演示程序所示。

#include <stdio.h>

void star( unsigned int );

int main( void )

    printf( "Enter number: " );
    unsigned int n;

    if ( scanf( "%u", &n) == 1 ) star( n );

    return 0;


void star( unsigned int n )

    if ( n )
    
        for ( unsigned int i = 0; i < n; i++)
        
            printf( "hi" );
        

        putchar( '\n' );

        if ( --n ) star( n );
    

请注意,如果最初调用函数时参数等于 0,则该函数不应输出任何内容。

【讨论】:

感谢您的帮助,现在我明白了。

以上是关于为啥for循环在c中无限进行的主要内容,如果未能解决你的问题,请参考以下文章

c语言里面,我for语句的循环跨度如果想是0.5应该怎么打呢,平时就是1++那么1+=0.5为啥

FOR循环中的上界在循环中没有改变,为啥?

RecyclerView里面嵌套一个无限循环的横向列表该怎么做

如何打破 C 中的无限 for(;;) 循环?

在实现无限循环时,使用 while(1) 与 for(;;) 与 goto (在 C 中)有区别吗?

C 无限循环(如果嵌套在 FOR LOOP 中)