You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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循环判断的先后顺序**,具体逻辑如下:

第一段代码的执行流程

  1. 初始化number=0,判断number < 9成立,进入外层循环体。
  2. 先执行内层乘法表打印逻辑(此时number为0,输出0与1-9的乘积)。
  3. 内层循环结束后,执行number++,number变为1。
  4. 重复上述步骤,直到number=8时:
    • 进入循环体,输出8与1-9的乘积。
    • 执行number++,number变为9。
    • 再次判断number < 9,条件不成立,外层循环终止。最终number的值为9。

第二段代码的执行流程

  1. 初始化number=0,判断number < 9成立,进入外层循环体。
  2. 先执行number++,number直接变为1。
  3. 再执行内层乘法表打印逻辑(此时number为1,输出1与1-9的乘积)。
  4. 重复上述步骤,直到number=8时:
    • 判断number < 9成立,进入循环体后立刻执行number++,number变为9。
    • 输出9与1-9的乘积。
    • 内层循环结束后,回到外层判断number < 9,条件不成立,循环终止。最终number的值仍为9。

你觉得第二段number最终是8,应该是把外层循环最后一次判断前的number值(8)当成了最终值,但实际上进入循环后number已经被自增为9,这个值会在循环结束后保留下来。


内容的提问来源于stack exchange,提问作者noob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:47:39