我不时会用一个while(1)块来压扁一连串if..else不成比例的东西.它沿着这些方向发展.
而不是做:
// process
if (success) {
// process
if (success) {
//process
if (success) {
// etc
}
}
}
Run Code Online (Sandbox Code Playgroud)
我做:
while (1) {
// process
if (!success) break;
// process
if (!success) break;
// process
if (!success) break;
// etc
break;
}
Run Code Online (Sandbox Code Playgroud)
我对这个结尾的隐含跳跃感到有些恼火while.我能用更精简的构造逃脱(即最后没有break)吗?
我可以break用变量(或寄存器?)来交易最终结果.这不是更精简或更清晰.
int once = 1;
while (once--) {
// process
if (!success) break;
// process
if (!success) break;
// process
if (!success) break;
// etc
}
Run Code Online (Sandbox Code Playgroud)
for循环看起来会好一些(C99):
for (int once = 1 ; once--; once) {
// process
if (!success) break;
// process
if (!success) break;
// process
if (!success) break;
// etc
}
Run Code Online (Sandbox Code Playgroud)
我想过使用开关盒.尽管它会起作用,但看起来并没有好多少.
switch (1) { default:
// process
if (!success) break;
// process
if (!success) break;
// process
if (!success) break;
// etc
}
Run Code Online (Sandbox Code Playgroud)
在这种特殊情况下,标签的概念似乎是无与伦比的.
// process
if (!success) goto end;
// process
if (!success) goto end;
// process
if (!success) goto end;
// etc
end:
Run Code Online (Sandbox Code Playgroud)
你们知道/使用的其他方法是什么?
oua*_*uah 146
你们知道/使用的其他方法是什么?
您可以将while循环封装在一个函数中(并在您拥有while循环的地方调用此函数):
static void process(void)
{
// process
if (!success) return;
// process
if (!success) return;
// process
if (!success) return;
// process
}
Run Code Online (Sandbox Code Playgroud)
如果调用一次,任何中途正常的编译器(例如,即使gcc禁用优化)也会内联static函数.(当然,一些变量可能必须在process函数的词法范围内,在这种情况下,只需将它们作为函数的参数提供).
请注意,从上到下而不是水平编写代码(例如,嵌套的示例if)称为duffing.这里有一篇关于这个主题的好文章:
此外,在Linux内核编码风格中,针对水平代码有一个特定的警告:
"如果你需要超过3级的缩进,你还是搞砸了,应该修复你的程序"
Fid*_*its 54
以下是一种非常类似于循环的方法,但最后不需要计数器或break语句.
do
{
// process
if (!success) break;
// process
if (!success) break;
// process
if (!success) break;
...
// No need for a break statement here
}
while(0);
Run Code Online (Sandbox Code Playgroud)
Cli*_*ord 38
如果您安排每个条件块生成的主体success是如下函数,或者每个// process都可以减少为布尔表达式,例如:
success = f1() ;
if( success )
{
success = f2() ;
if( success )
{
success = f3() ;
if( success )
{
success = f4()
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将此减少为使用短路评估的单个布尔表达式:
success = f1() &&
f2() &&
f3() &&
f4() ;
Run Code Online (Sandbox Code Playgroud)
在这里f2(),如果将不会被调用f1()表达式求值的第一中止-返回false,与同为每个连续通话&&操作数子表达式返回false.
Pau*_*oub 25
不清楚为什么你需要筑巢或打破.当序列需要在第一次失败时保释时,我会一直这样做:
// process
if (success) {
// more process
}
if (success) {
// still more process
}
if (success) {
// even more process
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |