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

C语言中数组下标前置自增未按预期工作,原因是什么?

问题根源:函数参数的求值顺序未定义

你遇到的是C语言标准里明确的未定义行为——函数多个参数的求值顺序并没有固定规则,编译器可以自由选择处理顺序。

在你的代码中:

printf("%d %d",array[i], array[++i]);

编译器选择了先处理右侧的array[++i]:

  1. 执行++i,i的值从0变为1;
  2. 再处理左侧的array[i],此时i已经是1,所以两次访问的都是array[1],最终输出2 2。

如果编译器选择从左到右求值,才会得到你预期的1 2,但C标准并没有要求必须这么做,所以这种写法本身就是错误的。

正确的写法

要避免这种问题,需要把变量的读取和修改操作拆分到不同的语句中,确保执行顺序明确:

方式1:拆分printf调用

#include <stdio.h>

int main()
{
    int array[5] = {1,2,3,4,5};
    int i = 0;
    printf("%d ", array[i]);
    printf("%d", array[++i]);
    return 0;
}

方式2:提前保存值

#include <stdio.h>

int main()
{
    int array[5] = {1,2,3,4,5};
    int i = 0;
    int first_val = array[i];
    int second_val = array[++i];
    printf("%d %d", first_val, second_val);
    return 0;
}

关键提示

永远不要在同一个函数调用的多个参数里,对同一个变量同时进行读取和修改操作,这类行为属于未定义行为,不同编译器、不同优化设置下的结果可能完全不同,甚至会导致更严重的程序异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:55:26