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
相关产品推荐
相关产品推荐

