替代控制结构

时间:2010-05-31 16:19:05

标签: java c++ c objective-c

我一直想知道编写控制结构的其他方法,比如你可以在Forth编写自己的语言结构。

您在if语句中尽早了解的内容是对此的替代:

if ( x ) {
   // true
} else {
   // false
}

有了这个(有时候,与许多括号相比,这更具可读性):

x ? true : false

让我思考。我们可以替换其他任何东西,因为它更具可读性。

因此,对于if声明并进行比较,我可以想到这些。

所以我想知道如何替换forwhile等循环结构。

例如,如何替换while循环(不使用for循环)。很可能用这些语言不能完成它?

while (a < b) {

}

7 个答案:

答案 0 :(得分:3)

  

如何替换while循环

可以通过递归替换循环。

void doWhile(a, b) {
    /* do something with a and b, hopefully changing them */
    if (a > b) doWhile(a, b);
}

答案 1 :(得分:1)

你在问题​​中提出了一个有趣的话题:C语言编程中的“boolean”是什么?

在我看来,答案是布尔值(实际上是布尔运算)是C中的隐式控制结构。

它来自“短路”规则 - 当&amp;&amp;和是假的或者是||是的,根本没有计算权利。除了条件跳转之外没有办法实现这个 - 任何按位OR和AND都不够。另外,考虑比较:a&gt; b被翻译为在大多数现代处理器上进行比较和有条件地跳转。当a> b时,它不是“在寄存器中存储1”。

您发现我们在逻辑运算和比较中使用隐式控制结构而不是显式“if”。有些语言更进一步 - 在Perl中考虑这个标准习惯用法:

open("myfile.txt") or die "Could not open file";

答案 2 :(得分:0)

它与控制结构无关。您会看到if生成bool值的情况。这实际上是包含在不需要的控制结构中的布尔表达式。您不能以这种方式重写通用if。就像说那样

int c = 0;
for (int i = 0; i < 10; i++)
   c++;

可以改写为c = 10;,它没有关于控制结构的内容。

产生这种过多的结构是因为有时候把它写成结构更容易,但不能尝试产生单个表达式。这源于懒惰和缺乏程序员的思考。这是一个例子。您需要计算递增数字的总和。什么先来到你的头上?右:

int sum = 0;
for (int i = 0; i < 10; i++)
   sum += i;

现在尝试找到单个表达式如何计算。这不太明显。

答案 3 :(得分:0)

答案 4 :(得分:0)

在某些情况下,您可以将所有逻辑放入“for-loop语句”的第三个参数中,并创建一个看起来空的但是做一些工作的循环(我不是说这是一个好的风格)。例如,

int t =0;
for (int i = 0; i++ <10; t+=10); // warning : don't forget  semicolon

答案 5 :(得分:0)

您也可以用布尔表达式替换:

 expr1 && expr2; 

相同
 if(expr1)
   expr2;

 expr1 || expr2;

相当于

 if(!expr1) expr2;

所以你可以替换

 if(expr1)
   expr2;
 else
   expr3;

通过

 expr1 && expr2;
!expr1 || expr3;

但为什么有人想这样做又是另一个问题。我的同事喜欢这种事情,因为他认为这使得他的节目更加出色。

答案 6 :(得分:0)

还有Smalltalk的做事方式。在Smalltalk中,EVERYTHING是一个对象,包括代码块。没有条件命令结构。

布尔类有两个子类,True和False(每个都有一个对象,分别为true和false)。条件是一个发送到布尔对象的方法,它有两个参数,一个代码块和一个else代码块。 True对象执行then分支,False对象执行else分支。

虽然循环类似,但for循环是整数对象的消息......

我觉得它很整洁。