8

对不起,新手的问题。我还在学习编程。所以我使用 C++,我需要做这样的事情:

int n;
do {
    n = get_data();
    if(n != -1)
        send(n);
} while(n != -1);

这只是一个草图。反正感觉不是很优雅。我必须进行两次测试。我可以只测试一次并设置一个标志,但这也不是很优雅,因为我必须检查标志两次。似乎应该有一种方法可以更轻松地做到这一点,因为我想做的事情很容易。

4

10 回答 10

19
int n;
while (-1 != (n = get_data())) {
    send(n);
} // while
于 2008-11-16T23:47:09.787 回答
17

Similar to eed3si9n's but arguably easier to read:

 int n;
 while (n = get_data(), n != -1)
 {
     send(n);
 }
于 2008-11-17T02:53:39.753 回答
15

如何使用break

int n;
while(1) {
    n = get_data();
    if(n == -1)
        break;
    send(n);
}

这样您只测试一次,如果 get_data 没有返回您想要的内容,则立即退出。

于 2008-11-16T23:46:20.037 回答
11
for (int n = get_data(); n != -1; n = get_data()) {
  send(n);
}
于 2008-11-17T03:15:52.343 回答
4

你的原版没问题。

在我上一份 C 编程工作中,我们必须遵循 MISRA 编码标准。

根据 MISRA 规则,这:

int n;
while(1) {
    n = get_data();
    if(n == -1)
        break;
    send(n);
}

被禁止是因为break, 并且这个:

while((n = get_data()) != -1) { send(n); }

被禁止,因为赋值出现在布尔上下文中,所以我习惯于编写类似于原始版本的循环。

如果您认为它会使您的意图更清晰,或者如果测试是一个复杂的表达式,您可以使用布尔变量:

int n;
bool valid;
do {
    n = get_data();
    valid = n != -1;
    if(valid)
        send(n);
} while(valid);

但是对于像“ n != -1”这样的简单测试,可能不值得让程序更长。

于 2008-11-17T00:01:45.450 回答
2
/* This is cleaner */ 
AGAIN:;
    int n = get_data();
    if (n != -1)
    {
        send(n);
        goto AGAIN;
    }


/* This has some charm as well */ 
int n;
while ((n = get_data()) != -1)
    send(n);
/* and now i see that this is the top answer.  Oh well */ 
于 2011-03-25T01:52:23.443 回答
1
int n;
n = get_data();
while (n != -1) {
  send(n);
  n = get_data();
}
于 2008-11-18T16:12:30.840 回答
0

goto:)构造

int n;
goto inside; do {
  send(n);
inside:
  n=get_data();
} while(n!=-1);
于 2008-11-18T10:47:02.403 回答
0

在 Python 中,你会这样做:

while True:
    n = get_data()
    if n == -1:
        break
    send(n)

如您所见,这并不比您的 C 版本短多少。通常,Python 代码比其 C 代码小 5 到 10 倍。这不是这里的情况,因此您可以享受可读、足够短、快速的片段,并专注于其他事情。

如果您确实想让它更短,请查看乔纳森的答案,但这并不重要。

于 2010-02-22T23:55:01.453 回答
-2
int get_data()
{
 ...
}

void _send(int )
{
 ...
}

int  send(int (*a) ())
{
   int n = a();

   if (n == -1)
      return n;

   _send(n);
   return 1;
}

int main()
{
  int (*fp)();
  fp = get_data;
  while ( send(fp)!= -1 );

  return 0;
}

高温高压

于 2008-11-18T12:50:01.453 回答