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

7行简单C代码运行结果疑问:printf输出2 1 1的原因求解

#include <stdio.h>

int main(){
    int i = 1;
    int *p = &i;
    printf("%d %d %d\n", *p, i++, i);
}

输出为2 1 1的原因

首先要明确一个核心规则:C语言标准从未规定函数调用时多个实参的求值顺序,这属于未定义行为,不同编译器、不同编译参数下的输出可能完全不同。你观察到的结果是编译器采用「从右到左求值」策略的典型表现,执行逻辑如下:

  • 第一步:求值最右侧的第三个实参i,此时i的取值为1,记录该参数的值为1
  • 第二步:求值中间的第二个实参i++,后置自增的特性是先返回变量原值再修改变量,所以记录该参数的值为1,随后i自增为2
  • 第三步:求值最左侧的第一个实参*p,p指向变量i,此时i已经被修改为2,记录该参数的值为2

printf会按照占位符从左到右的顺序输出三个参数的记录值,最终结果就是2 1 1。

i++输出为1的原因

后置自增运算符i++的语义就是先返回自增前的变量值,再执行变量自增操作,所以在获取这个实参的取值时,拿到的是i自增前的1,自增操作是在取值完成后才执行的,因此该参数的输出结果为1。

关于求值优先级的说明

这个问题和运算符优先级无关:优先级规则仅用来确定单个表达式内部运算符的计算顺序,而函数的多个实参是互相独立的表达式,它们的执行顺序不受优先级约束,C标准没有对其做强制规定。生产环境中绝对不要依赖实参求值顺序写代码,否则会出现不可预期的运行结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:39:04