对不起,新手的问题。我还在学习编程。所以我使用 C++,我需要做这样的事情:
int n;
do {
n = get_data();
if(n != -1)
send(n);
} while(n != -1);
这只是一个草图。反正感觉不是很优雅。我必须进行两次测试。我可以只测试一次并设置一个标志,但这也不是很优雅,因为我必须检查标志两次。似乎应该有一种方法可以更轻松地做到这一点,因为我想做的事情很容易。
int n;
while (-1 != (n = get_data())) {
send(n);
} // while
Similar to eed3si9n's but arguably easier to read:
int n;
while (n = get_data(), n != -1)
{
send(n);
}
如何使用break:
int n;
while(1) {
n = get_data();
if(n == -1)
break;
send(n);
}
这样您只测试一次,如果 get_data 没有返回您想要的内容,则立即退出。
for (int n = get_data(); n != -1; n = get_data()) {
send(n);
}
你的原版没问题。
在我上一份 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
”这样的简单测试,可能不值得让程序更长。
/* 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 */
int n;
n = get_data();
while (n != -1) {
send(n);
n = get_data();
}
用goto
:)构造
int n;
goto inside; do {
send(n);
inside:
n=get_data();
} while(n!=-1);
在 Python 中,你会这样做:
while True:
n = get_data()
if n == -1:
break
send(n)
如您所见,这并不比您的 C 版本短多少。通常,Python 代码比其 C 代码小 5 到 10 倍。这不是这里的情况,因此您可以享受可读、足够短、快速的片段,并专注于其他事情。
如果您确实想让它更短,请查看乔纳森的答案,但这并不重要。
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;
}
高温高压