++x*++x*++x

风子在某神QQ群给了一段代码

    int x=1;
    printf("%d\n", ++x*++x*++x);

问输出什么。

考察如下程序

#include<stdio.h>
int main()
{
    int x=1;
    printf("%d\n", ++x*++x*++x);
    return 0;
}

求其输出。

我会这样计算:

x=1

x=x+1

tmp=x

x=x+1

tmp=tmp*x

x=x+1

tmp=tmp*x

输出tmp即24。

GCC

输出为36。

输出编译后汇编源代码(部分)

movl $1, 28(%esp)
incl 28(%esp)
incl 28(%esp)
movl 28(%esp), %eax
imull 28(%esp), %eax
incl 28(%esp)
imull 28(%esp), %eax
movl %eax, 4(%esp)

可以看出gcc是这样计算的:

x=1

x=x+1

x=x+1

tmp=x

tmp=tmp*x

x=x+1

tmp=tmp*x

输出tmp即36

也就是语法树从下到上执行, ++x直接修改变量的内存, 然后乘。

试考虑++x+ ++x*++x

VC++

输出为64。

大量实验表明, vc++是如下行为:

x=1

x=x+1

x=x+1

x=x+1

tmp=x

tmp=tmp*x

tmp=tmp*x

输出tmp即为64

也就是先计算所有的++x。

Xcode

输出为24。

网友告诉我是如下计算:

x=1

x=x+1

tmp=x

x=x+1

tmp=tmp*x

x=x+1

tmp=tmp*x

输出tmp即24。

也就是语法树从下到上执行, 把++x的结果保存在一个或多个临时空间里面, 然后乘。

发表评论?

2 条评论。

  1. 应该是“输出风子(写出这段代码的人)被打”的结果。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/5272QrCode