为什么break语句无法突破while循环?

时间:2014-09-13 15:15:32

标签: while-loop d

这是一个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 个答案:

答案 0 :(得分:4)

在输入-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,请查看hereforeach通常优于while来迭代集合,除非您有充分的理由不这样做。