while(n--)

C语言循环与递减操作解析

 

下面这段代码我们都很熟悉

  1. #include <stdio.h>

  2. int main()

  3. {

  4. int n=5;

  5. while(n)

  6. {

  7. n=n-1;

  8. }

  9. printf("%d\n",n);

  10. return 0;

  11. }

它的输出结果为0.

 

再看下面这一段代码:

  1. #include <stdio.h>

  2. int main()

  3. {

  4. int n=5;

  5. while(n--)

  6. {

  7. ;

  8. }

  9. printf("%d\n",n);

  10. return 0;

  11. }

它的输出结果却是-1.

 

很多人都认为这两段代码是等价的,我之前也误认为它们等价,但是实验证明这不是等价的。

第二段代码中,while(n--),当n=0时,并没有马上跳过循环条件和循环体,而是将循环条件执行完再跳过循环体。

原因:n--是一个整体,从编译器gcc角度看,先将n赋值给一个临时变量,然后自身减去1,返回的不是n而是临时变量。此时临时变量0,n为-1。故n--操作是一个整体,必须完整的执行完,不是割裂看的。之前,我误认为while中判断n为0时就直接结束。

`while( n-- )` 是一种常见于 C、C++ 等编程语言中的循环控制语句。以下是关于它的含义、用法及相关知识: ### 含义 `while( n-- )` 的原型是 `while(n && n=n-1)` ,其执行逻辑为:先判断 `n` 是否为零(在编程语言里,零代表假,非零代表真),若 `n` 不为零,则执行循环体,之后 `n` 自减 1;若 `n` 为零,则不执行循环体,直接退出循环。从编译器 `gcc` 角度看,`n--` 是一个整体,先将 `n` 赋值给一个临时变量,然后自身减去 1,返回的是临时变量。当临时变量为 0 时,`n` 为 -1,且 `n--` 操作必须完整执行,并非割裂看待 [^2][^4]。 ### 用法 #### 循环体中没有变量 `n` 此时 `n` 可以仅仅代表 `while` 循环的循环次数。例如: ```c #include <stdio.h> int main() { int n = 5; while (n--) { printf("This is a loop.\n"); } return 0; } ``` 上述代码中,循环会执行 5 次,每次打印 “This is a loop.”。循环结束后,`n` 的值为 -1 [^3]。 #### 循环体中有变量 `n` 此时要注意,循环 `n` 次,`n` 进入循环时已减 1(出循环时也会减 1)。例如: ```c #include <stdio.h> int main() { int n = 5; while (n--) { printf("%d\n", n); } return 0; } ``` 上述代码会依次打印 4、3、2、1、0。循环结束后,`n` 的值为 -1 [^3]。 ### 相关知识 - **与 `while(n)` 的区别**:`while(n)` 是当 `n` 为真(即非零)时运行循环,每次循环结束后,`n` 的值不会自动改变;而 `while( n-- )` 每次判断后会将 `n` 的值减 1 [^2]。 - **与 `while(--n)` 的区别**:`while(--n)` 是先将 `n` 自减 1,再判断 `n` 的真假,为真则进入循环,为假则退出循环;而 `while( n-- )` 是先判断 `n` 的真假,为真则进入循环,之后 `n` 再自减 1 [^3]。 ### 使用注意事项 若需要用到 `n` 的数据,一定要预先处理;若不需要使用 `n` 的数据,则不需要做预处理 [^1]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值