C++含后置自增和逻辑或的for循环执行逻辑及结果疑问
C++ 循环逻辑问题解答
先还原问题代码:
for(int i=1;i<=n;){ f++; if((i++==p) || (i++==p)) break; }
前置核心规则
搞懂以下3个规则就能完全理清运行逻辑:
- 后置自增
i++特性:先返回i的当前值参与表达式运算,再执行i自增1 - 逻辑或
||短路规则:如果左半边表达式结果为真,右半边表达式会直接跳过不执行 - 本循环的for头没有设置第三段增量表达式,所以i的数值更新只会发生在if判断的两次
i++中
每轮循环的固定执行顺序:
- 先判断
i <=n是否成立,不成立直接退出循环 - 执行
f++,f数值加1 - 执行if判断逻辑:
- 先计算左半边
i++ == p:拿当前i和p比较,之后i自增1 - 左半边结果为真则触发短路,右半边
i++不执行,直接触发break退出循环 - 左半边结果为假则执行右半边
i++ == p:拿当前i和p比较,之后i自增1 - 右半边结果为真触发break,为假则进入下一轮循环判断
- 先计算左半边
各测试用例执行过程
用例1:n=7,p=3,f初始值为0
- 第一轮循环:
- 初始i=1,满足
1<=7 - f自增到1
- if判断:左半边
1==3为假,i自增到2;右半边2==3为假,i自增到3 - 不触发break,进入下一轮
- 初始i=1,满足
- 第二轮循环:
- i=3,满足
3<=7 - f自增到2
- if判断:左半边
3==3为真,i自增到4,触发短路,右半边不执行,触发break退出循环
- i=3,满足
- 最终f=2,符合实际输出。之前预期f=1是误认为第一轮循环就能匹配到p=3,实际第一轮两次i++后i才到3,要到第二轮才会触发判断匹配。
用例2:n=7,p=4,f初始值为0
- 第一轮循环:
- 初始i=1,满足
1<=7 - f自增到1
- if判断:左半边
1==4为假,i自增到2;右半边2==4为假,i自增到3 - 不触发break,进入下一轮
- 初始i=1,满足
- 第二轮循环:
- i=3,满足
3<=7 - f自增到2
- if判断:左半边
3==4为假,i自增到4;右半边4==4为真,i自增到5,触发break退出循环
- i=3,满足
- 最终f=2,符合实际输出。
用例3:n=7,p=5,f初始值为0
- 第一轮循环:
- 初始i=1,满足
1<=7 - f自增到1
- if判断:左半边
1==5为假,i自增到2;右半边2==5为假,i自增到3 - 不触发break,进入下一轮
- 初始i=1,满足
- 第二轮循环:
- i=3,满足
3<=7 - f自增到2
- if判断:左半边
3==5为假,i自增到4;右半边4==5为假,i自增到5 - 不触发break,进入下一轮
- i=3,满足
- 第三轮循环:
- i=5,满足
5<=7 - f自增到3
- if判断:左半边
5==5为真,i自增到6,触发短路,右半边不执行,触发break退出循环
- i=5,满足
- 最终f=3,符合实际输出。
内容的提问来源于stack exchange,提问作者Prasanjay Reddy
相关产品推荐
相关产品推荐

