我的while循环过早退出

时间:2013-04-30 02:07:14

标签: c++ loops while-loop

感谢您阅读此内容。 我正在编写一个代码来读取大数据文件。我尝试使用while循环一次读取一个。 但是当我写作

while(TimeStep++) 

它将在第一个循环中退出。 如果我写,

while(TimeStep+=1)

一切都会好的。 另外,如果我初始化

int TimeStep=-1;

它将在第一个循环中退出。但是如果我初始化

int TimeStep=0;

没关系。 while()的魔力使我迷惑。请帮我理解while循环。

这是我的所有代码。

//get diffusion of all the particles in the 256Coordinate.txt file and diffusion of a single particle.

using namespace std;
typedef vector<double> vec;

int ReadStructure(vec & Coordinate,int size,ifstream & TrajectoryFile){
    double a;

    for(int i=0;i<size*3;i++){
        if(!(TrajectoryFile.eof())){
            TrajectoryFile>>a;
            Coordinate[i]=a;
        }
    }

    //cout<<Coordinate[1]<<endl;

    if(TrajectoryFile.eof()){
        return 1;
    } else {
        return 0;
    }
}



int main(){
    int ContinueFlag=0,i,j,k;
    double a,b,c;
    vec Coordinate;
    string filename= ("../256Coordinate.txt"); // a file that contains 256*5000*3 numbers
    int size=256;
    Coordinate.resize(size*3);
    int TimeStep=0;
    ifstream TrajectoryFile(filename.c_str());//open the .txt file and begin the read data
    //TrajectoryFile>>a;
    //cout<<a<<endl;

    while(TimeStep+=1){//keep looping untils breaks.
        ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);//read the .txt file and store the values in the vector Coordinate[3*256]. Read 3
        *256 numbers at a time.
            // cout<<"ContinueFlag= "<<ContinueFlag<<endl;
            if(ContinueFlag==1) break;//if we reach the end of the file, exit.
        // cout<<Coordinate[1]<<endl;
    }

    cout<<"total number of timesteps= "<<TimeStep-1<<endl;
}

5 个答案:

答案 0 :(得分:1)

while循环将在loop condition

下执行
while(loop condition)

true

因此,如果您将TimeStep =0设置为开头。它将在执行while循环之前测试TimeStep ==0是否为True。任何非零值都被视为0。如果是int TimeStep=-1;,循环体将不会执行。

如果您初始化为TimeStep+=1TimeStep =0将设置false,这相当于 while (true) ,因此循环体不会执行。

如果您事先不知道循环终止条件,只需使用

TimeStep

比使用这样的 while(true){ ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile); if(ContinueFlag==1) break; } 变量更好。

尝试:

{{1}}

答案 1 :(得分:1)

在C ++中,整数值0为False,包括负整数的任何其他值为True。虽然循环在错误时退出。

答案 2 :(得分:1)

我认为你的主要问题是不理解while循环,它理解增量运算符++

让我们举个例子:

int x = 5;
int y = x++;

此处,x的值为6(因为您创建了++),但y的值是多少?实际上,它将是5。这是一个所谓的“后增量”运算符:请参见先分配,然后再增加。

如果你写了这个

int x = 5;
int y = (x += 1);

然后你会像以前一样x = 6,但这次y = 6也是如此,所以你先增加x,然后再将其分配给y

这会让你的while循环误解消失:

int TimeStep = 0;
while(TimeStep++) 

在这里,TimeStep 获取1的值,但{/ 1}}仅使用 来测试退出,但while会看到旧值(上例中为while),旧值为y,因此0会立即退出。

while

在这种情况下循环继续,因为你首先递增int TimeStep = 0; while(TimeStep+=1) 然后让TimeStep测试它是否为非零。

我真的建议你写一个简单的循环,为什么你测试while是否非零?就这样做:

TimeStep

答案 3 :(得分:0)

如果truefalse,则while循环需要TimeStep++ / TimeStep = -1false,因为TimeStep++添加1到TimeStep,所以== 0,如果TimeStep = 0并且你加1那么总是true,因为每个值都是true!= 0 ...

答案 4 :(得分:0)

我认为你可能需要更好地理解布尔代数。

以下是教程http://www.electronics-tutorials.ws/boolean/bool_7.html的链接。

while循环基于布尔表达式。如果while循环括号内的表达式为true,它将进入循环并停止,直到该表达式的计算结果为false。

当您使用的整数设置为0或1时,它起作用,因为0表示false,1表示true。如果整数不是0或1,则不能将整数用作布尔表达式。

当ContinueFlag == 1时,您似乎希望循环中断。所以只需将其用作while循环参数。另一种方法是将代码更改为while(true)。

由于你希望ContinueFlag至少被设置一次(所以你知道什么时候休息)我建议使用do while循环,它至少执行一次,然后在表达式为真时重复。

使用它:

do {
    ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);
    TimeStep++; //This allows for TimeStep to increment
} while (ContinueFlag!=1); //It will loop while ContinueFlag!=1 which will cause  
                           //the loop to end when ContinueFlag==1 

这是编写代码的更好方法(而不是while(true))。这使您可以轻松查看循环的目的。