代码之家  ›  专栏  ›  技术社区  ›  Alistair Sutherland

替代控制结构

  •  2
  • Alistair Sutherland  · 技术社区  · 7 年前

    我一直在想其他的方法来编写控制结构,比如您可以在forth中编写自己的语言结构。

    你很早就学到的 if 声明是对以下内容的替代:

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

    有了这个(有时与许多括号相比,它更易读):

    x ? true : false
    

    这让我思考。我们能换别的吗,以防它更易读。

    所以这些是我能想到的 如果 陈述和做比较。

    所以我想知道如何替换这样的循环结构 for , while 等。

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

    while (a < b) {
    
    }
    
    7 回复  |  直到 16 年前
        1
  •  3
  •   Arkadiy    16 年前

    你怎么替换while循环

    循环可以用递归替换。

    void doWhile(a, b) {
        /* do something with a and b, hopefully changing them */
        if (a > b) doWhile(a, b);
    }
    
        2
  •  1
  •   Arkadiy    16 年前

    你提出了一个有趣的问题:在类C编程中,“布尔”是什么?

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

    它来自“短路”规则-当“左”为假或“左”为真时,完全不计算“右”。除了条件跳转之外,没有其他方法可以实现这一点——任何按位或和都是不够的。另外,考虑比较:A>B被转换为比较,并有条件地跳到大多数现代处理器上。它不是“A>B时在寄存器中存储1”。

    您所发现的是,我们在逻辑操作和比较中使用隐式控制结构,而不是显式的“if”结构。有些语言将其进一步扩展了一个层次-考虑一下Perl中的这个标准习语:

    open("myfile.txt") or die "Could not open file";
    
        3
  •  0
  •   Andrey    16 年前

    这与控制结构无关。你把箱子放在哪里 if 生产 bool 价值。这实际上是包装在不需要的控制结构中的布尔表达式。不能重写泛型 如果 这种方式。就像这样说

    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;
    

    现在试着找到一个表达式如何计算这个数。这不太明显。

        4
  •  0
  •   Klaim    16 年前
        5
  •  0
  •   a1ex07    16 年前

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

    int t =0;
    for (int i = 0; i++ <10; t+=10); // warning : don't forget  semicolon
    
        6
  •  0
  •   Patrick Schlüter    16 年前

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

     expr1 && expr2; 
    

    是同一件事

     if(expr1)
       expr2;
    

     expr1 || expr2;
    

    等于

     if(!expr1) expr2;
    

    所以你可以替换

     if(expr1)
       expr2;
     else
       expr3;
    

    通过

     expr1 && expr2;
    !expr1 || expr3;
    

    但为什么会有人想这样做是一个完全不同的问题。我的同事喜欢这样的东西,因为他认为这会使他的程序更简单。

        7
  •  0
  •   Brian Postow    16 年前

    做事情的方式总是很简单。在Smalltalk中,一切都是一个对象,包括代码块。没有条件命令结构。

    Boolean类有两个子类,true和false(每个子类有一个对象,分别为true和false)。条件是用两个参数发送给布尔对象的方法,一个是then代码块,另一个是else代码块。真对象执行then分支,假对象执行else分支。

    虽然循环是相似的,但是for循环是传递给integer对象的消息…

    我觉得挺干净的。