为什么你的 for 循环死活只跑了一次?VS2013 空语句陷阱深度解析 不知道你有没有遇到过这种让人抓狂的事情在 VS2013 里写了一个很简单的 for 循环想打印 1 到 10按下 F5 运行结果控制台上只孤零零地打印了一个数字就结束了#includestdio.hintmain(){inti;for(i1;i10;i);{printf(%d\n,i);}return0;}按 F5 运行VS2013 编译通过零报错零警告。控制台只输出了一个11然后程序就结束了。那一瞬间你是不是怀疑 VS2013 出了问题或者自己写的循环逻辑哪里不对明明 for 循环里写的是i 10为什么只跑了一次就罢工了而且打印出来的还是 11罪魁祸首for 括号后面那个隐形分号现在我们瞪大眼睛再看一遍上面那段代码。仔细看 for 那一行括号的最后面是不是紧跟着一个不起眼的分号对就是for (i 1; i 10; i);那个在右括号后面的分号。在 C 语言的语法里单独一个分号;是一条合法的语句叫作空语句null statement意思就是什么都不做。当你把分号紧贴在 for 的括号后面时编译器会认为你想表达的是“给我循环 10 次每次循环什么都不干。”于是for 循环老老实实地把i执行了 10 次从 1 自增到了 11。然后循环结束了。循环结束后程序继续往下走遇到了大括号里的printf(%d\n, i);。此时i的值已经是 11 了所以控制台上打印出了 11。关键点来了那个大括号{}根本不是 for 循环的循环体它只是一个独立的代码块跟在空语句后面和 for 循环没有任何关系这就是为什么你的循环只跑了一次——实际上循环跑了 10 次但大括号里的代码只执行了 1 次因为它不在循环里避坑方案知道了原因解决方案就很简单了——把 for 括号后面的分号删掉。#includestdio.hintmain(){inti;for(i1;i10;i){printf(%d\n,i);}return0;}这样编译运行控制台就会乖乖地打印出 1 到 10一切正常。如何在 VS2013 里发现这种隐形 BugVS2013 的编译器对这种情况默认不会报错也不会弹 warning。因为从语法上来说这真的没有错——空语句是标准语法。但有一个小技巧可以帮你提前发现这类问题在 VS2013 里如果你把鼠标悬停在for (...);那个分号上编译器有时候会用智能提示告诉你这里有一个空语句或null statement。养成写完代码后扫一眼 for、while、if 括号末尾有没有多余分号的好习惯能帮你省下大量的调试时间。还有一种更简单粗暴的防范方法养成把{直接写在 for 括号同一行末尾的习惯就像for (...) {这样这样你就没有机会在中间插一个分号了。今日思考题如果我写的是while (i 10);后面加个分号会发生什么按 F5 运行后程序会正常结束还是会直接卡死动手试一下把你的发现写在评论区标签#C语言#for循环#空语句#VS2013#避坑指南