C++新手问询:为何给定代码运行后log输出为10而非1?
代码log值输出为10的执行逻辑解析
核心误区拆解
这段代码的认知偏差主要来自两个新手高发的踩坑点:
- 第一,代码块归属的判断逻辑偏差
C++中代码块的归属完全由语法符号决定,和排版缩进没有任何关联。你记忆里在for行末尾看到的分号;,代表这个for循环的循环体是空语句——如果这个分号真实存在,那后面缩进的log++是和for循环同级的独立语句,只会在整个空循环结束后执行一次,最终log值应为1,和实际输出的10完全不符。这也侧面说明:你实际编译运行的代码中,根本没有在for行尾加上这个多余的分号,log++是真正属于for循环的循环体。 - 第二,for循环的执行次数计算偏差
你以为循环只会触发一次log++,本质是没有逐次推演循环的完整流程。当log++属于循环体时,整个循环的执行步骤如下:- 初始化循环变量
int i =1,初始log值为0 - 检查循环条件
i <1024:如果条件成立,先执行循环体log++,再执行增量操作i = i *2,之后回到条件检查步骤;如果条件不成立,直接退出循环。
逐次的执行状态为:
- 初始状态:i=1,log=0
- 第一次条件判断:i=1 <1024,成立。执行log++后log=1,i更新为2
- 第二次条件判断:i=2 <1024,成立。执行log++后log=2,i更新为4
- 第三次条件判断:i=4 <1024,成立。执行log++后log=3,i更新为8
- 第四次条件判断:i=8 <1024,成立。执行log++后log=4,i更新为16
- 第五次条件判断:i=16 <1024,成立。执行log++后log=5,i更新为32
- 第六次条件判断:i=32 <1024,成立。执行log++后log=6,i更新为64
- 第七次条件判断:i=64 <1024,成立。执行log++后log=7,i更新为128
- 第八次条件判断:i=128 <1024,成立。执行log++后log=8,i更新为256
- 第九次条件判断:i=256 <1024,成立。执行log++后log=9,i更新为512
- 第十次条件判断:i=512 <1024,成立。执行log++后log=10,i更新为1024
- 第十一次条件判断:i=1024 <1024,不成立。循环直接退出。
可以看到,循环一共满足条件10次,log从0逐次自增,最终值就是10,和实际输出完全匹配。
- 初始化循环变量
同类踩坑提醒
- 编写for循环时,不要随手在for行末尾添加分号,这类错误编译阶段不会提示,但会导致循环体变成空语句,完全偏离预期逻辑。
- 永远不要依赖缩进判断代码的归属,任何排版上的缩进都不具备语法效力,只有大括号、作为循环体的有效语句、空分号才会决定代码的执行范围。
内容的提问来源于stack exchange,提问作者Roberto Ornelas
相关产品推荐
相关产品推荐

