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

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的推演

你所用的编译环境默认是按从右到左的顺序求值参数,按该规则推演过程如下:

  1. 首先计算最右侧的num++:后置自增返回自增前的原值5,计算完成后num的值变为6
  2. 接下来计算中间的++num:前置自增先将num的值从6修改为7,返回自增后的值7
  3. 最后计算最左侧的num:此时num已经是7,直接返回值7
  4. 三个参数的求值结果按从左到右的参数位置传入printf格式化,最终输出7 7 5

注意:该输出仅对应你当前的编译环境,换其他环境完全可能输出其他结果(包括你预想的5 6 7),甚至出现程序崩溃等异常。这类没有序列点分隔、多次读写同一变量的代码属于错误写法,禁止在生产环境中使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:15:03