C语言中 int a=5,b=-3,c=4;printf("%d %d",(++a,b++,b++),b++);为什么结果是-2 -2?int a=5,b=-3,c=4;printf("%d %d",(++a,b++),b++);为什么结果就变成-3 -3?

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/26 16:52:52
C语言中inta=5,b=-3,c=4;printf("%d%d",(++a,b++,b++),b++);为什么结果是-2-2?inta=5,b=-3,c=4;printf("%d%d",(++a,b

C语言中 int a=5,b=-3,c=4;printf("%d %d",(++a,b++,b++),b++);为什么结果是-2 -2?int a=5,b=-3,c=4;printf("%d %d",(++a,b++),b++);为什么结果就变成-3 -3?
C语言中 int a=5,b=-3,c=4;printf("%d %d",(++a,b++,b++),b++);为什么结果是-2 -2?
int a=5,b=-3,c=4;printf("%d %d",(++a,b++),b++);为什么结果就变成-3 -3?

C语言中 int a=5,b=-3,c=4;printf("%d %d",(++a,b++,b++),b++);为什么结果是-2 -2?int a=5,b=-3,c=4;printf("%d %d",(++a,b++),b++);为什么结果就变成-3 -3?
#include <stdio.h>
int main(void)
{
    int a=5,b=-3;
    
    printf("%d %d",(++a,b++),b++);
    
    return 0;
}
 
//gcc编译结果
gcc -Wall -ansi -S -o m.s main.c 
main.c: 在函数‘main’中:
main.c:9: 警告:‘b’上的运算结果可能是未定义的

andl $-16, %esp
subl $32, %esp
movl $5, 24(%esp) //a = 5
movl $-3, 28(%esp) //b = -3
movl 28(%esp), %ecx //printf最右边参数 b = -3
addl $1, 28(%esp) //b ++ b = -2
addl $1, 24(%esp) //a ++ a = 6
movl 28(%esp), %edx //printf倒数第二个参数 b = -2
addl $1, 28(%esp) //b++
movl $.LC0, %eax //准备printf参数%d %d
movl %ecx, 8(%esp) //以下是参数入栈
movl %edx, 4(%esp)//就是将ecx eax edx的值压栈
movl %eax, (%esp)
call printf //调用printf
//最后结果是 -2 -3
//不同的编译器处理是不一样的,不要写这种代码
//如果是考试题目,参考往年的题目跟着答案写,死记硬背