C语言中数组下标前置自增未按预期工作,原因是什么?
问题根源:函数参数的求值顺序未定义
你遇到的是C语言标准里明确的未定义行为——函数多个参数的求值顺序并没有固定规则,编译器可以自由选择处理顺序。
在你的代码中:
printf("%d %d",array[i], array[++i]);
编译器选择了先处理右侧的array[++i]:
- 执行
++i,i的值从0变为1; - 再处理左侧的
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
相关产品推荐
相关产品推荐

