对(;;)意味着什么?

时间:2011-11-27 11:31:01

标签: c

我对for(;;)构造感到困惑。我认为这是一种无限循环的速记形式,但我不能确定。

以下是代码:

for(;;)
{
    //whatever statements
}

6 个答案:

答案 0 :(得分:12)

你的猜测是正确的;这是一个无限循环。 * 这是一个常见的C语言,虽然许多人(包括我)认为以下内容不那么神秘:

while (1) { whatever statements; }

<小时/> *假设没有break / return /等,这是无限的。循环体内的语句。

答案 1 :(得分:2)

这是一个未终止的循环。它有时用while

编写
while (1)

甚至更好:

while (true)

我希望在任何此类循环中看到breakreturn,无论是使用for还是while。必须有一些异常的控制流程,否则它将是一个无限循环。

答案 2 :(得分:2)

是的,这是for C语法,包含初始化表达式,循环条件和增量表达式的空白字段。

for语句也可以使用多个值,例如:

for (i=0, j=100, k=1000; j < 500 || i<50 || k==5000; i++, j+=2, k*=6) {}; 

for理解中可能还有一步之遥? =)

答案 3 :(得分:1)

是的,for循环中的表达式只是可选的。如果你省略它们,你将得到一个无限循环。离开的方法是休息或退出等。

答案 4 :(得分:0)

这句话基本上等于:

while(1) {}

没有开始,没有条件,也没有步骤声明。

答案 5 :(得分:0)

据我了解,for(;;)创建了一个故意的非退出循环。您的代码应根据一个或多个条件退出循环。它曾经作为一种更纯粹的方式提供给我做一个假的循环,这不被认为是好的语法。例如,根据退出条件,可以更轻松地分派给函数来处理结果,失败,警告或成功。

我的解释可能不是某人使用该构造的原因,但我会更详细地解释它对我意味着什么。这种结构可能是某人的纯粹C&#34;有一个循环的方法,你可以在其中连续执行多个步骤,其完成意味着你的应用程序执行了所有初始化步骤。

#define GEN_FAILURE -99
#define SUCCESS 0

/* perform_init_step1() and perform_init_step2() are dummy 
   place-holder functions that provide a complete example. 
   You could at least have one of them return non-zero
   for testing. */

int perform_init_step1();
int perform_init_step2(); 

int perform_init_step1()
{ 
   return 0;
}

int perform_init_step2()
{
   return 0;
}   
int ret_code = GEN_FAILURE;
for(;;)
{
   if(SUCCESS != perform_init_step1())
   {
     ret_code = -1;
     break;
   }

   if(SUCCESS != perform_init_step2())
   {
     ret_code = -2;
     break;
   }

   break;
}

如果部分初始化失败,则循环将使用特定的错误代码进行终止。

我使用C做了很多固件工作,用汇编语言编写。优秀的汇编语言程序员教会我有一个入口点和单个出口。我把他们的建议铭记于心,因为他们的信条在调试时极大地帮助了我们。

就个人而言,我从不喜欢for(;;)构造,因为如果你忘记打破,你可以拥有一个无限循环;在最后。

我曾与之合作的人想出了do..until(FALSE),但这引起的适当C风格的数量是不可信的。

#define GEN_FAILURE -99
#define SUCCESS 0

/* perform_init_step1() and perform_init_step2() are dummy 
   place-holder functions that provide a complete example. 
   You could at least have one of them return non-zero
   for testing. */

int perform_init_step1();
int perform_init_step2(); 

int perform_init_step1()
{ 
   return 0;
}

int perform_init_step2()
{
   return 0;
}   

int ret_code = GEN_FAILURE;


do
{
   if(SUCCESS != perform_init_step1())
   {
     ret_code = -1;
     break;
   }

   if(SUCCESS != perform_init_step2())
   {
     ret_code = -2;
     break;
   }

}

until (FALSE);

无论如何都会运行一次。