求大神指导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值变化看不懂,求讲解一下,谢谢!
...全文
190 6 打赏 收藏 转发到动态 举报
写回复
用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增加到字符串末尾
主要特性Java 语言是简单的:Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。Java 语言是面向对象的:Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的:Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java 语言是健壮的:Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。Java语言是安全的:Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。Java 语言是体系结构中立的:Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java 语言是可移植的:这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。Java 语言是解释型的:如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行执行过程中需要的类在联接阶段被载入到运行环境中。Java 是高性能的:与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。Java 语言是多线程的:在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。Java 语言是动态的:Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

64,637

社区成员

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

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