为何number++的位置不同会导致C程序运行结果出现差异?
两段C代码中number值差异的原因
先看第一段代码:
int main() { int number = 0, step; while (number < 9) { int step = 0; while (step < 9) { step++, printf("%d * %d = %d\n", step, number, step * number); } number++; } return 0; }
再看第二段代码:
int main() { int number = 0, step; while (number < 9) { number++; int step = 0; while (step < 9) { step++, printf("%d * %d = %d\n", step, number, step * number); } } return 0; }
问题
两段C语言代码仅number++的位置存在差异,第一段代码中number最终变为9,第二段中number最终变为8,请问该差异是如何产生的?我原本认为两段代码的运行结果应该完全一致。
实际执行逻辑与差异解释
首先纠正一个细节:两段代码执行结束后,number的最终值其实都是9,你可能混淆了循环执行过程中的临时值和最终值。核心差异来自**number++的执行时机与外层while循环判断的先后顺序**,具体逻辑如下:
第一段代码的执行流程
- 初始化
number=0,判断number < 9成立,进入外层循环体。 - 先执行内层乘法表打印逻辑(此时
number为0,输出0与1-9的乘积)。 - 内层循环结束后,执行
number++,number变为1。 - 重复上述步骤,直到
number=8时:- 进入循环体,输出8与1-9的乘积。
- 执行
number++,number变为9。 - 再次判断
number < 9,条件不成立,外层循环终止。最终number的值为9。
第二段代码的执行流程
- 初始化
number=0,判断number < 9成立,进入外层循环体。 - 先执行
number++,number直接变为1。 - 再执行内层乘法表打印逻辑(此时
number为1,输出1与1-9的乘积)。 - 重复上述步骤,直到
number=8时:- 判断
number < 9成立,进入循环体后立刻执行number++,number变为9。 - 输出9与1-9的乘积。
- 内层循环结束后,回到外层判断
number < 9,条件不成立,循环终止。最终number的值仍为9。
- 判断
你觉得第二段number最终是8,应该是把外层循环最后一次判断前的number值(8)当成了最终值,但实际上进入循环后number已经被自增为9,这个值会在循环结束后保留下来。
内容的提问来源于stack exchange,提问作者noob
相关产品推荐
相关产品推荐

