gcc : (a++)*(a++)问题

int main()
{
    int a = 5;
    int b = 0;

    b = (a++)*(a++);
    printf("b:%d\n", b);
    return 0;
}

结果是25

为什么不是30呢,因(a++)*(a++)是一个乘法表达式,(a++)处理需要两条指令,第一条是获取a的值,++在第二条指令,而这个表达式在(a++)第一条指令就已经获取到值,所以++操作才会被置后处理.

实际上这段c代码被编译成汇编就成这样了:

   movl    $5, 28(%esp)
        movl    28(%esp), %eax
        imull   28(%esp), %eax
        movl    %eax, 24(%esp)
        addl    $1, 28(%esp)
        addl    $1, 28(%esp)

再成c翻译一下:

a=5:

b=a*a;

a=a+1;

a=a+1;

或许其他编译器会有不同的解释.

猜你喜欢

转载自blog.csdn.net/u012385733/article/details/81512243
今日推荐