C++ while循环求序列第二大值的代码逻辑疑问求助
C++ while循环求序列第二大值逻辑梳理
核心误解澄清
- max不会在每次循环时自动重置为0:整个代码中max仅在两处被显式赋值,第一处是初始时将第一个输入值赋给max,第二处仅当新读入的数值大于当前max时,才会更新max的值,其余时间max会保留之前的计算结果。
n > max的判断完全可能成立:while循环体的第一行代码是cin >> n,也就是每次进入循环都会读取序列中的下一个新数值,这个新数值完全可能大于初始的max值。
代码运行流程演示
我们以两组示例输入分别走一遍代码逻辑,即可明确运行规则:
示例2:输入序列 2 1 0
- 初始执行
cin >> n读入第一个数2,max = n后max值为2,smax初始值为0 - while循环判断当前n=2≠0,进入循环体
- 执行
cin >> n读入下一个数1,当前n=1 - 第一个判断
1 > 2不成立,进入else if判断1 > 0成立,smax更新为1 - 回到while条件判断,当前n=1≠0,再次进入循环体
- 执行
cin >> n读入0,当前n=0 - 两个判断条件都不成立,smax保持为1
- while条件判断n=0不满足,退出循环,输出smax=1,结果正确
示例1:输入序列 4 4 2 3 0
- 初始执行
cin >> n读入第一个数4,max = n后max值为4,smax初始值为0 - while循环判断n=4≠0,进入循环体,读入下一个数4,当前n=4
- 第一个判断
4>4不成立,else if判断4>0成立,smax更新为4 - 回到while条件n=4≠0,进入循环读入2,当前n=2,两个判断都不成立,smax保持4
- 回到while条件n=2≠0,进入循环读入3,当前n=3,两个判断都不成立,smax保持4
- 回到while条件n=3≠0,进入循环读入0,当前n=0,两个判断都不成立
- 退出循环输出smax=4,结果正确
额外场景验证
如果输入序列为3 5 2 0:
- 初始读入3,max=3,smax=0
- 进入循环读入5,
5>3成立,smax更新为原来的max也就是3,max更新为5 - 后续读入2、0都不会触发更新,最终输出smax=3,为正确的第二大值。
内容的提问来源于stack exchange,提问作者Ssd
相关产品推荐
相关产品推荐

