C++ while循环条件疑问:为何<=3会出现5次输入尝试?
分析三种PIN验证循环条件的差异
先帮你理清楚代码的基础执行逻辑:程序一开始会让用户输入1次PIN(循环外的std::cin >> pin),此时tries还是初始值0;之后进入while循环,每次循环体内会再触发1次输入,然后tries加1。接下来逐个拆解三个条件的差异:
1. pin != 1234 && tries <= 3 —— 导致5次输入的原因
我们模拟全程输错PIN的场景:
- 第1次输入:循环外的输入,
tries = 0 - PIN不对,且
0 <= 3成立,进入循环:第2次输入,tries变为1 - 再次判断:PIN不对,
1 <=3成立,进入循环:第3次输入,tries变为2 - 再次判断:PIN不对,
2 <=3成立,进入循环:第4次输入,tries变为3 - 再次判断:PIN不对,
3 <=3仍然成立,进入循环:第5次输入,tries变为4 - 最后判断:
4 <=3不成立,退出循环
问题核心在于tries等于3时,<=3的条件依然为真,程序会多执行一轮循环体,最终导致总共5次输入尝试。
2. pin != 1234 && tries != 3 —— 符合预期的情况
同样模拟全程输错的场景:
- 第1次输入:循环外的输入,
tries =0 - PIN不对,
0 !=3成立,进入循环:第2次输入,tries变为1 - PIN不对,
1 !=3成立,进入循环:第3次输入,tries变为2 - PIN不对,
2 !=3成立,进入循环:第4次输入,tries变为3 - 最后判断:
3 !=3不成立,退出循环
此时总共4次输入。当tries达到3时,条件直接不满足,不会再执行循环体,刚好控制了循环内的输入次数为3次,加上初始的1次,刚好是常见验证逻辑里的“3次错误尝试后退出”。
3. pin != 1234 && tries <3 —— 同样符合预期的情况
依旧模拟全程输错的场景:
- 第1次输入:循环外的输入,
tries=0 - PIN不对,
0 <3成立,进入循环:第2次输入,tries变为1 - PIN不对,
1 <3成立,进入循环:第3次输入,tries变为2 - PIN不对,
2 <3成立,进入循环:第4次输入,tries变为3 - 最后判断:
3 <3不成立,退出循环
这个条件和tries !=3在你的代码里效果一致——因为tries是从0开始递增的整数,tries <3等价于tries <=2,当tries到3时直接退出循环,不会多执行一次输入,最终也是4次输入,符合预期。
额外小建议
你的代码里,循环外的第一次输入没有被计入tries,其实有点不符合直观的“尝试次数”统计。如果想严格控制最多3次尝试(包含第一次),可以把输入逻辑都放进循环里,示例如下:
#include <iostream> int main() { int pin = 0; int tries = 0; std::cout << "BANK OF CODECADEMY\n"; while (pin != 1234 && tries < 3) { std::cout << "Enter your PIN: "; std::cin >> pin; tries++; } if (pin == 1234) { std::cout << "PIN accepted!\n"; std::cout << "You now have access.\n "; } else { std::cout << "Too many failed attempts!\n"; } }
这样tries从0开始,最多循环3次,刚好对应3次输入尝试,逻辑更清晰。
内容的提问来源于stack exchange,提问作者Aman Yadav
相关产品推荐
相关产品推荐

