d-为什么break语句未能突破while循环



这里有一个D练习:

import std.stdio;
void main()
{
    int[] narray;
    while(true) {
        writeln("Enter your numbers: ");
        int tmp;
        readf(" %s", &tmp);
        if(tmp == -1) {
            writeln("It's -1, finish reading numbers.");
            break;
        }
        else {
            writeln("Storing ", tmp, " to array.");
            narray ~= tmp;
            printArray(narray);
        }
    }
    int[] narrayOdd;
    int[] narrayEven;
    int counter = 0;
    while(counter < narray.length) {
        if((counter % 2) == 0) {
            narrayEven ~= narray[counter];
        }
        else {
            narrayOdd ~= narray[counter];
        }
    }
    narrayOdd.sort;
    narrayEven.sort;
    writeln("Your numbers in odd positions sorted: ");
    printArray(narrayOdd);
    writeln("Your numbers in even positions sorted: ");
    printArray(narrayEven);
}
void printArray(int[] x) {
    int counter;
    while(counter < x.length) {
        write(x[counter], " ");
        counter++;
    }
    write("n");
}

当用户输入-1时,我本想打破while循环,但它拒绝这样做。有什么问题吗?

我同时尝试了dmd和ldc2。

当您输入-1时,确实突破while循环,然后继续进入下一个while循环。您正在检查while(counter < narray.length),但从未递增计数器。尝试:

while(counter < narray.length) {
    if((counter % 2) == 0) {
        narrayEven ~= narray[counter++];
    }
    else {
        narrayOdd ~= narray[counter++];
    }
}

或:

foreach(counter , value ; narray) {
   if((counter % 2) == 0) {
       narrayEven ~= value;
   }
   else {
       narrayOdd ~= value;
   }
}

在第二种形式中,foreach循环创建两个临时变量。counter表示每个元素的索引并自动递增,value表示该索引处的值。

如果您不熟悉foreach,请查看此处。对于在集合上迭代,foreach通常比while更可取,除非您有充分的理由这样做。

最新更新