C语言printf传入num、++num、num++为何输出7 7 5而非5 6 7?
#include <stdio.h> int main( void ) { int num = 5; printf( "%d %d %d", num, ++num, num++ ); }
核心原因
该代码的输出不符合预期,本质是触发了C语言的未定义行为(Undefined Behavior, UB),根源在于C标准没有规定函数实参的求值顺序。
- C语言标准仅要求函数所有实参求值完成后才会进入函数体执行,但多个实参之间的求值顺序没有任何强制约定,不同编译器、不同优化等级下的求值顺序都可能存在差异,开发者不能对参数求值顺序做任何假设。
- 上述代码中
printf的3个实参num、++num、num++都在操作同一个变量num,且多个读写操作之间没有序列点(Sequence Point)做顺序约束,属于典型的未定义行为场景。
当前环境输出7 7 5的推演
你所用的编译环境默认是按从右到左的顺序求值参数,按该规则推演过程如下:
- 首先计算最右侧的
num++:后置自增返回自增前的原值5,计算完成后num的值变为6 - 接下来计算中间的
++num:前置自增先将num的值从6修改为7,返回自增后的值7 - 最后计算最左侧的
num:此时num已经是7,直接返回值7 - 三个参数的求值结果按从左到右的参数位置传入
printf格式化,最终输出7 7 5
注意:该输出仅对应你当前的编译环境,换其他环境完全可能输出其他结果(包括你预想的
5 6 7),甚至出现程序崩溃等异常。这类没有序列点分隔、多次读写同一变量的代码属于错误写法,禁止在生产环境中使用。
内容的提问来源于stack exchange,提问作者LEARNING
相关产品推荐
相关产品推荐

