for(k=i=0;s[i];i++)
{ for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
if(j<0) t[k++]=s[i];
}
第一次 i=0
s[i]是外层判断条件,只要s没结束就不是\n,就符合条件循环下去。
j=-1,但不满足j>=0条件,
所以不执行if(s[i]==s[j]) break;
执行if(j<0) t[k++]=s[i];其实质是t[0]=s[0],k++;就是将s第一个字符赋给了t第一个字符。
.
.
.
i=N 时
j=N-1,满足j>=0,执行if(s[i]==s[j]) break;这句是在判断当前s第N+1个字符s[i]是否与s之前的字符相同,
如果相同就直接跳出for循环,如果不同j--,执行if(s[i]==s[j]) break;判断 s[i]==s[j] 继续向前查找是否有与s[i]相同的字符。一旦找到也跳出。
这里就有两种情况:
第一种,该字符在之前已出现过,那么在
for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
中通过遍历,总是能找到与之相同的字符也就跳出了,此时j值定满足j>=0,那么跳出后,由于j>=0,if(j<0) t[k++]=s[i];这句就无效了,意思就是,重复的字符不会记录在t中了。
第二种,该字符s[i]没有在之前出现过,那么在
for(j=i-1;j>=0;j--)
if(s[i]==s[j]) break;
中通过遍历,肯定找不到,这个循环会从j=N-1开始通过j--循环到j=-1,不满足j>=0条件而退出此for循环。
此后执行if(j<0) t[k++]=s[i];此时j=-1,满足条件,t[k++]=s[i];就是将该新出现的字符s[i]赋给t[k],同时k++,准备接受下一个从未出现的字符。
温馨提示:答案为网友推荐,仅供参考