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

C语言中printf("%d %d %d",a,a=a+5,a)输出为何是15,15,15?

为什么这段C代码输出是15,15,15而非10,15,10?

先看你给出的代码:

#include <stdio.h>

int main() {
    int a=10;
    printf("%d %d %d",a,a=a+5,a);

    return 0;
}

核心原因:未定义行为与参数求值顺序

  1. C标准未规定函数参数的求值顺序:printf这类函数的多个实参,编译器可选择任意顺序求值(从左到右、从右到左或其他顺序),这是标准允许的「未指定行为」。
  2. 参数间的变量修改+读取触发未定义行为:你的代码中,中间参数a=a+5直接修改了变量a,另外两个参数同时读取a。C标准明确规定:如果在没有序列点(sequence point)的情况下,对同一个对象的修改和读取/修改操作同时存在,程序行为属于未定义行为——也就是说,标准不保证任何特定输出,甚至程序崩溃都是合法的。

针对你的输出的具体解释

你看到的15,15,15,是因为你使用的编译器选择了从右到左的参数求值顺序,且a=a+5的修改立即对所有读取a的参数生效:编译器在处理参数时,先执行了a=a+5将a改为15,之后左右两个a的读取都拿到了修改后的值。本质上因为是未定义行为,具体执行细节无需深究,重点是这种写法本身存在严重问题。

正确写法示例

如果想要得到预期的10,15,10,需把变量修改和printf调用分开,通过分号引入序列点:

#include <stdio.h>

int main() {
    int a=10;
    int temp = a + 5;
    printf("%d %d %d", a, temp, a); // 输出10 15 10

    // 或者分步执行
    printf("%d ", a);
    a = a + 5;
    printf("%d ", a);
    printf("%d\n", 10);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:03:23