C while(条件);没有指示在身体

时间:2014-03-31 21:25:21

标签: c while-loop

我正在学习C,我对此感到怀疑。在我的练习中:

while(1){
   while((sockacc = accept(ds_sock,&client,&length)) == -1);

   --other instructions--
}

谁能告诉我第二次的功能是什么?我的意思是,我知道接受电话是用来做什么的。如果身体里没有任何东西,我不明白为什么要使用while条件。

3 个答案:

答案 0 :(得分:4)

您可以将整个代码重写为:

while(1){
    do {
        sockacc = accept(ds_sock,&client,&length);
    } 
    while(sockacc == -1);

   --other instructions--
}

while语句中的部分只是在每次循环迭代时执行,它本身确定循环是否终止。

答案 1 :(得分:4)

退后一步。请记住

的含义
while(c) s;

只是一种简短的写作方式:

CONTINUE: 
if (c) 
  goto BODY;  
else 
  goto BREAK;
BODY: 
s;
goto CONTINUE;
BREAK: ;

当然break;continue;goto BREAK;goto CONTINUE;。循环并不神奇;他们只是写一堆goto陈述的简短而愉快的方式。

所以你的计划:

while(1){
  while((sockacc = accept(ds_sock,&client,&length)) == -1);
  --other instructions--
}

是一种更好的写作方式:

OUTER_CONTINUE: 
if (1) 
  goto OUTER_BODY;  
else 
  goto OUTER_BREAK;
OUTER_BODY: 
{
  INNER_CONTINUE: 
  if ((sockacc = accept(ds_sock,&client,&length)) == -1) 
    goto INNER_BODY;  
  else 
    goto INNER_BREAK;
  INNER_BODY: 
  ;
  goto INNER_CONTINUE;
  INNER_BREAK: ;
  --other instructions--
}
goto OUTER_CONTINUE;
OUTER_BREAK: ;

答案 2 :(得分:1)

accept()可以返回失败(-1)的原因之一是EINTR(系统调用中断)。如果它返回错误EINTR,或者实际上是任何其他错误,则此代码中的内部循环将重试accept(),因为它不会测试内部循环体中errno的值。如果错误是EBADF(错误的文件描述符,表明套接字文件描述符不是套接字文件描述符或以某种方式被破坏),这可能是性能问题。通常,您会在循环体中看到一个测试,以确保错误是代码所期望的有限集之一。