C++while循环v[i++]vs while body中的i++



我有一个关于while循环中迭代的问题。假设我们有一个大小为10的向量,元素从0-9开始。我们有一个只迭代一次的for循环,在for循环中我们有while循环。当我打印循环时,我得到了两个不同的结果,我不确定为什么。

我理解第一个循环背后的想法,我们在while的主体中增加j,并且在最后一次迭代时不进入循环,因为j是5,所以我们只打印0-4。第二个循环是我在理解方面遇到问题的地方。我的逻辑是,首先我们将指针j增加到1,这就是为什么我们将1而不是0。但是一旦j是4,v[j++]=5,并且在循环中的条件下,当v[j++]=5时中断,那么为什么我们仍然是5呢?感谢您的帮助。

vector<int> v(10);
for(int i = 0; i < v.size(); i++){
v[i] = i;
}
int j = 0;
for(int i = 0; i < 1; i++){ // first loop
while(v[j] != 5){
cout << v[j]; //prints 0 1 2 3 4
j++;
}
}
for(int i = 0; i < 1; i++){ //second loop
while(v[j++] != 5){
cout << v[j]; //prints 1 2 3 4 5
}
}

j++将递增j的值,但在递增之前返回j的原始值。

int i =0;
int j = 0;
i = 1;
j = i++;
(i is 2, j is 1)

如上所述,j++将递增j所以当j是3时,v[j++]是4,所以while中的条件没有被打破。但由于j++,当cout被执行时,j是4,v[4]是5,所以5被打印

后缀增量从概念上复制内存中的操作数,增量原始操作数,并最终产生副本的值。

下面的片段相当简单。在打印vector的内容之后,j已经被递增。

vector<int> v(10);
for(int i = 0; i < v.size(); i++){
v[i] = i;
}
int j = 0;
for(int i = 0; i < 1; i++){ // first loop
while(v[j] != 5){
cout << v[j]; //prints 0 1 2 3 4
j++;
}
}

现在,让我们来看看第二个循环。

vector<int> v(10);
for(int i = 0; i < v.size(); i++){
v[i] = i;
}
int j = 0;
for(int i = 0; i < 1; i++){ // second loop
// values of j are 0 1 2 3 4
while(v[j++] != 5){
// values of j are 1 2 3 4 5 because it has been incremented
cout << v[j]; //prints 1 2 3 4 5
}
}

您忘记在第一个循环后重新初始化j。如果要在第二个循环中从1打印到5,则应在第二次循环运行之前将j重新初始化为0。尝试:

vector<int> v(10);
for (int i = 0; i < v.size(); i++) {
v[i] = i;
}
int j = 0;
for (int i = 0; i < 1; i++) { // first loop
while (v[j] != 5) {
cout << v[j]; //prints 0 1 2 3 4
j++;
}
}
j = 0;
for (int i = 0; i < 1; i++) { //second loop
while (v[j++] != 5) {
cout << v[j]; //prints 1 2 3 4 5
}
}

使用单个for循环将有助于更好地理解代码,因为循环的两个条件相同。

vector<int> v(10);
for (int i = 0; i < v.size(); i++) {
v[i] = i;
}
int j = 0;
for (int i = 0; i < 1; i++) { // first loop
while (v[j] != 5) {
cout << v[j]; //prints 0 1 2 3 4
j++;
}
// joined the end of the first loop and the start of the second loop
j = 0;
while (v[j++] != 5) {
cout << v[j]; //prints 1 2 3 4 5
}
}

希望这将有助于回答您的问题

最新更新