Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 是否有任何编程语言具有for while循环?_Loops_Language Features_Structured Programming - Fatal编程技术网

Loops 是否有任何编程语言具有for while循环?

Loops 是否有任何编程语言具有for while循环?,loops,language-features,structured-programming,Loops,Language Features,Structured Programming,这就是我所说的for while循环的意思: 用于(;)while(); 它大致可以翻译为: 而(){ } 这看起来像是一场灾难。然而,我所知道的任何语言都没有这样的控制结构。因此,一个常见的解决方法是按如下方式实施: while(true){ 除非()断裂; } 虽然这样做有效,但感觉很笨重。在我的拙见中,在无限循环的中间有一个有条件的中断违背结构化编程的精神。 下面是一个激励性的例子,说明需要for while循环: 功能交换(arr、i、j){ var tmp=arr[i]; a

这就是我所说的for while循环的意思:

用于(;)while();
它大致可以翻译为:


而(){
}
这看起来像是一场灾难。然而,我所知道的任何语言都没有这样的控制结构。因此,一个常见的解决方法是按如下方式实施:


while(true){
除非()断裂;
}
虽然这样做有效,但感觉很笨重。在我的拙见中,在无限循环的中间有一个有条件的中断违背结构化编程的精神。

下面是一个激励性的例子,说明需要for while循环:

功能交换(arr、i、j){
var tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
返回arr;
}
函数heapify(heap,i){
var len=heap.length;
for(var min=i;swap(heap,i,min),i=min){
左变量=2*i+1;
var right=2*(i+1);
如果(left
正如您所看到的,该控件非常容易理解,代码比变通方法干净得多:

功能交换(arr、i、j){
var tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
返回arr;
}
函数heapify(heap,i){
var len=heap.length;
var min=i;
do(对){
左变量=2*i+1;
var right=2*(i+1);
如果(left

不管怎样,你知道有哪种编程语言有这样的控制结构吗?Lisp不算数,因为它主要是功能性的,我正在寻找一种主要是命令式的编程语言。

我意识到这不是一个完全令人满意的答案,因为c#没有这样的内置控制结构,但我原本预计语法会更简洁,因此它几乎就是您想要的。(事实证明,c#不会将lambda表达式隐式转换为布尔函数,因此表达式周围会出现显式的“垃圾”)

除此之外,下面的c#代码演示了我在评论中提到的备选关键字选择:
do{}while(;)
。此do-while更新语法比您建议的for-while语法更好地匹配模式流。除非您关心构造变量的范围,否则任何新的构造都需要为
(如for循环)指定一个特殊的位置,这已经是一个疑问了,但根据我的经验,任何现有的do构造都不提供这样的位置

var min = i; //<init>
do {
    //<body>
    var left = 2 * i + 1;
    var right = 2 * (i + 1);

    if (left < len && heap[left] < heap[min])
        min = left;
    if (right < len && heap[right] < heap[min])
        min = right;
} while ((min != 1) // <test>
    ? ((Func<bool>)(() => {
        swap(heap, i, min); i = min; //<update>
        return true; }))() : false);
var min=i//
做{
//
左变量=2*i+1;
var right=2*(i+1);
if(左{
交换(堆,i,min);i=min//
返回true;}():false);

注意:三元条件运算符确保只有当
为真时才执行
部分。

这样一种“非常常见的编程模式”,以至于我认为在我四十年的日志生涯中从未见过它?:-)@paxdiablo也许您没有编写过许多需要这种控制结构的程序,这很好。然而,在我长达十年的编程经验中,我已经多次遇到这种模式。这不是很常见的模式。然而,我认为这已经足够普遍,可以保证一个新的控制结构。@paxdiablo这里有一个类似于我描述的控制结构的例子。这表明我所描述的编程模式确实并不少见。@paxdiablo顺便说一句,似乎这个模式被称为模式。因此,这确实是一种非常常见的模式。为什么用“for while”而不是带有可选表达式的“do while”?像
do{}while(;)关键字“do”和结构已经暗示在测试之前执行。“for”关键字通常意味着一个长期存在的模式,即。这不会改变你的需求,也不会回答你的问题,但关键字选择更有意义。