C++写的这段语句是怎么执行的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++写的这段语句是怎么执行的?相关的知识,希望对你有一定的参考价值。
int m=20;
for(i=0;i<m-1;i++)
if(queue[i]==queue[i+1])
for(j=i+1;j<m-1;j++)
queue[j]=queue[j+1]; m--; i-=1;
请教前面的i++和后面的m--,i-=1是如何构成循环的?
这段代码翻译成一般的说明性文字是:
对于一个长度为m的数组queue.从小到大一次处理它的每一个元素。如果元素i和它的下一个元素i+1相同的话,则将元素i+1删除,将i+1之后的每一个元素复制到它们前面一个位置,这个时候数组的长度将会少1,执行m--将数组长度减1。下一个循环再来判断这个元素i; 如果元素i和它的下一个元素i+1不同的话,那么下一个循环判断元素i+1.
用一个例子来说明会更清楚一些:假定一个m = 8 的数组,其中相邻的有3 个5(为了说明方便,分别用5、5*、5**来表示),现在i = 3, 即正在处理queue[3].
1
3
4
5 <--- queue[3]
5*
5**
6
7
首先执行queue[i] == queue[i+1],为真,说明queue[3]和queue[4]的值是相同的,那么执行if中的代码。首先调用for循环,将queue[5]、queue[6]、queue[7]分别挪到前面一个(也就是将queue[4]删除了),执行完for循环后,数组如下:
1
3
4
5 <--- queue[3]
5**
6
7
这个时候,数组的长度少了1(因为queue[4]被删除了),所以要将m--,重新修改数组的长度。然后执行i-=1让i=2;然后会执行for循环体中的i++,这样下一轮循环将会继续处理queue[3]。你可以看到,如果没有i-=1这一步的话,下一个循环将会处理queue[4],那么就会忽略了queue[3]和现在queue[4]的比较(事实上按照我们的初衷,这个queue[4]也是应该被删去的),从而保留queue[4],即5**的那个数字,这样算法将会出错。 参考技术A int m=20;
for(i=0;i<m-1;i++)
if(queue[i]==queue[i+1])
for(j=i+1;j<m-1;j++)
queue[j]=queue[j+1];
m--; i-=1;
m--;i-=1不参与第二个循环,程序执行完2个FOR语句后再执行m--
i-=1
我感觉就这样,这样不矛盾,你自己再看看,我也觉的别扭
以上是关于C++写的这段语句是怎么执行的?的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 6.44 的这段代码在哪里执行?