C语言中变量j归零后自增行为的原因解析求助
分析C语言代码中变量j持续自增的原因
第一次外层循环的执行逻辑
你的代码中,第一次进入while(1)外层循环时:
- 初始
i=2,j=2 - 内层
while(i--)循环里,后置自减运算符i--的逻辑是先返回当前i的值用于条件判断,再将i减1:- 第一次判断:i当前值为2(非0),执行
j--,j变为1;随后i自减为1 - 第二次判断:i当前值为1(非0),执行
j--,j变为0;随后i自减为0 - 第三次判断:i当前值为0(条件不成立),随后i自减为-1,内层循环退出
- 第一次判断:i当前值为2(非0),执行
- 此时i=-1,j=0,和你输出的第一阶段结果完全一致
后续循环的矛盾点与解释
按照你提供的代码逻辑,当i变为-1后,后续每次外层循环进入内层while(i--)时:
- 先取i的当前值-1(非0,条件为真),执行
j--(j应该递减),随后i自减为-2 - 再次判断i的当前值-2(非0),继续执行
j--,i自减为-3……这个过程会无限持续(因为i始终是负数,条件永远为真),根本不会执行内层循环后的printf语句
但你的输出显示j持续递增且i始终为-1,这说明代码和输出存在不匹配的情况,最可能的原因有两个:
- 你粘贴的代码有误,内层循环体实际是
j++而非j--:如果是j++,每次内层循环执行时j都会递增,且由于i始终为负数,内层循环会无限执行,你看到的“每次外层循环j增1”可能是输出被截断或误判了循环次数 - 输出内容存在笔误,实际j是递减而非递增,且i会变为-2、-3等负数
修正代码的建议
如果你希望避免内层无限循环,需要在外层循环中重置i的值,比如每次外层循环开始时将i重新设为初始值:
int main(void) { int j = 2; while(1) { int i = 2; // 每次外层循环重置i printf("initial i : %d ---------- \n", i); printf("initial j : %d ---------- \n", j); while(i--) { j--; } printf("the second i : %d ---------- \n", i); printf("the second j : %d ---------- \n", j); printf("----------------------------------\n"); } }
内容的提问来源于stack exchange,提问作者bibo
相关产品推荐
相关产品推荐

