C:infinte循环的正确原因

时间:2016-08-25 19:51:30

标签: c for-loop

我与另一位大学生讨论过以下原因是否存在无限循环。

#include <stdio.h>
#include <stdlib.h>

void print_sign2(void);

int ctr;
char sign1='x';
char sign2='=';


int main() {
    for (ctr=0; ctr<10; ctr++){
        printf("%c",sign1);
        print_sign2();
    }
    return 0;
}

void print_sign2(void) {
    for (ctr=0; ctr<2; ctr++)
        printf("%c",sign2);
}

我认为这个循环是因为ctr整数是全局的,并且也在函数print_sign2中使用。这意味着每次调用函数print_sign2时,ctr都设置为0.这是对的吗?

3 个答案:

答案 0 :(得分:6)

print_sign2完成后,ctr<2为false。第一次变为false时ctr为2.所以ctr为2.因此main中的循环永远不会终止,因为ctr永远不会超过3而ctr<10 angular.module('ui.bootstrap.demo', ['ngAnimate', 'ui.bootstrap']) .controller('AccordionDemoCtrl', function($scope) { $scope.oneAtATime = true; $scope.groups = [{ title: 'Dynamic Group Header - 1', content: 'Dynamic Group Body - 1' }, { title: 'Dynamic Group Header - 2', content: 'Dynamic Group Body - 2 Dynamic Group Header - 2 Dynamic Group Header - 2 Dynamic Group Header - 2 Dynamic Group Header - 2 Dynamic Group Header - 2' }]; $scope.items = ['Item 1', 'Item 2', 'Item 3']; $scope.addItem = function() { var newItemNo = $scope.items.length + 1; $scope.items.push('Item ' + newItemNo); }; $scope.status = { isFirstOpen: true, isFirstDisabled: false }; //scrolling var accordion = $('.accordion'), timeOut; accordion.on('click', '.panel-heading', function(e) { if(e.target.nodeName != 'SPAN') return; var element = this; clearTimeout(timeOut); //since we dont know the exact offsetTop for dynamic content //using timeout 350 which let angular complete its render timeOut = setTimeout(function() { accordion.animate({ scrollTop: element.offsetTop -2 }, 300); }, 350); }); }); 1}}总是如此。

答案 1 :(得分:2)

ctr永远不会超过main中的2,这就是为什么它是无限循环。

每次print_sign2(),它都会设置ctr = 2的值。

答案 2 :(得分:0)

不要将全局变量用作循环控制变量。这只是糟糕的编程习惯。改为使用局部变量。

使用局部变量进行循环控制可以完全避免这些问题。

#include <stdio.h>
#include <stdlib.h>

void print_sign2(void);

char sign1='x';
char sign2='=';


int main() {
   int ctr;
   for (ctr=0; ctr<10; ctr++){
      printf("%c",sign1);
      print_sign2();
   }
   return 0;
}

void print_sign2(void) {
   int ctr;
   for (ctr=0; ctr<2; ctr++)
      printf("%c",sign2);
}