无花括号且末尾带分号的while循环是什么含义?
不带花括号且末尾带分号的while循环解析
基础语法说明
在C/C++这类基于C语法的语言中,while循环的语法规则是:
while(条件表达式) 循环体语句;
这里的「循环体语句」可以是单条执行语句,也可以是用{}包裹的代码块。如果while条件后直接跟分号;,就表示循环体是空语句——也就是条件满足时,循环什么都不做,只是反复检查条件,直到条件不成立才退出循环。
结合你的代码具体分析
看你提供的这段代码:
while(i < j){ while(distance(arr[++i]) < distance(p)); while(distance(arr[--j]) > distance(p)); if(i < j){ swap(arr, i, j); } }
第一个内层while循环
while(distance(arr[++i]) < distance(p));
这个循环的逻辑是:
- 先执行
++i,让i的值自增1; - 计算
distance(arr[i])和distance(p)的大小; - 如果前者小于后者,就重复步骤1和2;
- 直到
distance(arr[i]) >= distance(p)时,循环停止。
简单说,它的作用是把i指针向右移动,直到找到第一个arr[i]的distance不小于p的distance的位置。
第二个内层while循环
while(distance(arr[--j]) > distance(p));
逻辑类似:
- 先执行
--j,让j的值自减1; - 计算
distance(arr[j])和distance(p)的大小; - 如果前者大于后者,就重复步骤1和2;
- 直到
distance(arr[j]) <= distance(p)时,循环停止。
作用是把j指针向左移动,直到找到第一个arr[j]的distance不大于p的distance的位置。
整体逻辑
当两个内层循环找到对应的i和j后,如果此时i仍然小于j,就交换arr[i]和arr[j],然后外层while(i<j)继续执行,直到i >= j时整个循环结束——这看起来像是某种快速排序的分区逻辑,把数组元素按和p的distance大小进行划分。
注意事项
这种空循环体的写法虽然合法,但可读性很差,很容易被误认为是代码笔误(比如漏写了花括号)。实际开发中,建议改成更清晰的写法,比如用花括号包裹空循环体并加注释:
while(distance(arr[++i]) < distance(p)) { // 空循环:移动i至第一个不满足distance(arr[i]) < distance(p)的位置 }
内容的提问来源于stack exchange,提问作者Daniel Yoon
相关产品推荐
相关产品推荐

