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; }
核心原因:未定义行为与参数求值顺序
- C标准未规定函数参数的求值顺序:printf这类函数的多个实参,编译器可选择任意顺序求值(从左到右、从右到左或其他顺序),这是标准允许的「未指定行为」。
- 参数间的变量修改+读取触发未定义行为:你的代码中,中间参数
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
相关产品推荐
相关产品推荐

