求大神指导while这一块儿程序的执行步骤

yjiangling 2016-11-16 12:25:51
程序代码如下:
int main()
{
char s[]="SSSWILTECH1\1\11W\1WALLMP1";
char c;
int k;
for(k=0;(c=s[k])!='\0';k++)
{
switch(c)
{
case 'A':cout<<'a';continue;
case '1':break;
case 1:while((c=s[++k])!='\1'&&c!='\0');
case 9:cout<<'#';
case 'E':
case 'F':continue;
default:cout<<c;continue;
}
cout<<'*';
}
cout<<endl;
}


在while循环这块儿实在看不懂,没有执行语句,不知到程序是怎么执行的,单步调试也没看明白,求个大神给讲解一下呗,谢谢了!个人觉得k值变化看不懂,求讲解一下,谢谢!
...全文
196 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gurlsandguys 2016-11-17
  • 打赏
  • 举报
回复
引用 5 楼 yjiangling 的回复:
我做过好几次单步调试,但我发现k=11的时候,c='\1',然后执行到while循环这里,再下一步k突然就到14了,而c仍然是‘\1‘,再接着,k=15,c='W'?不是k=14的时候c='W'吗?
S S S W I L T E C H 1 \1 \11 W \1 W A L L M P 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 while((c=s[++k])!='\1'&&c!='\0'); for(k=0;(c=s[k])!='\0';k++); 首先,从k=0开始,一直被for循环+1,因为中间没有c=1的情况,所以while一直不执行,而执行其他case,后面省略其他case。 直到k=11,在for循环中将s[11]赋给c,也就是1,注意不是字符'1'; 这时(c=s[++k])!='\1就等于c=s[11+1] !='\1',k=12,c=s[12]=‘\11’,循环成立,再判断。 k先加1,k=13,c=s[13]='w'。循环成立,再判断。 k先加1,k=14,c=s[14]='\1',循环不成立,向下执行。 //因为循环是1行,所以单步时,从11跳到14 for循环结束,k++;k变成了15。 for接着判断 c=s[k]!=0,c变成了s[15]='w',switch不满足c=1。所以不执行while循环。 for循环结束,k++;k变成了16。 for接着判断 c=s[k]!=0,c变成了s[16]='A',在switch中c不满足为1。所以不执行while循环。 for循环结束,k++;k变成了17。 。。。。。。 能看懂了吗,问题和陷阱应该在字符串的理解上。 SSSWILTECH1\1\11W\1WALLMP1这个字符串是这样的 字符:S S S W I L T E C H 1 8进制:1 11 字符:W 8进制: 1 字符 :W A L L M P 1 其中, 8进制 1 就是十进制1,满足switch中的while的case, 8进制 11 等于10进制的9,满足case 9:cout<<'#'; 字符 1 对应switch中 case '1':break; 注意,这个break没有跳出for循环。是switch的标配。
yjiangling 2016-11-16
  • 打赏
  • 举报
回复
我做过好几次单步调试,但我发现k=11的时候,c='\1',然后执行到while循环这里,再下一步k突然就到14了,而c仍然是‘\1‘,再接着,k=15,c='W'?不是k=14的时候c='W'吗?
gurlsandguys 2016-11-16
  • 打赏
  • 举报
回复
在执行while语句时,虽然内部是空的,但是每次判断时,++k这个语句就会让k加1 里面的 (c=s[++k])!='\1'&&c!='\0'中分成 (c=s[++k])!='\1' 和 c!='\0' 而 (c=s[++k])!='\1' 又分成 c=s[++k]不等于'\1' c=s[++k]是个赋值语句,其中每次赋值前,步骤是先将k++,再作为s的下标,赋值给c 判断一次,k就加了1,如果判断成功,while继续,执行空语句,执行完了,再判断 再判断的过程中,k又加了1。 结果来看,虽然while里是空的,但是也执行了很多次的判断,在判断的过程中,影响了k的值
小灸舞 2016-11-16
  • 打赏
  • 举报
回复
while虽然没有执行语句,但它在不停的判断,k每次都会++,不断的在向后判断字符
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 版主 2016-11-16
  • 打赏
  • 举报
回复
另外,你的各个case后面还需要加上break;
paschen 版主 2016-11-16
  • 打赏
  • 举报
回复
没有执行语句就是执行语句为空,每次循环什么也不干,但是判断循环条件的时候会递加k,这样可以一直让k增加到字符串末尾

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧