首先,我不会汇编语言,也没有进入反编译参看它具体是如何进行运算的。我这里写出来只是一个总结,或者说碰到这样的题,我们该如何写出这个结果。
下面我主要分析的还是在VC下进行:
void main(){ int i=5; int k; k=(i++)+(++i)+(i++);//6+6+6=18// k=(++i)+(++i)+(++i) ;//7+7+8=22// k=(i++)+(i)+(i++);//5+5+5=15// k=(i++)+(++i)+(++i);//6+6+7=19 // k=(i++)+(i++)+(++i);//5+5+6=16// k=(i++)+(++i)+(i++);//6+6+6=18// k=(++i)+(++i);//7+7=14// k=(++i)+(i++)+(i++)+(i++);//6+6+6+6=24// k=(i++)+(i)+(++i);//5+5+6=16 printf("%d %d",k,i);}上面的代码给出了计算测试的结果,我们并对结果进行了分析,尽管这种分析可能是错误的,但是我们在上述的测试中都通过了验证。
1、首先我们看第一个 k=(i++)+(++i)+(i++);我们先在计算这个表达式上遵循两个原则:1)加号和自加运算符的优先级原则。2)从左到右两两相加的原则。
那么对于上式我们分两步进行运算先计算(i++)+(++i)的结果,然后在计算该结果和最后一个(i++)相加的结果。在第一步中,我们先考虑优先级的原则即++和+号的优先级,加号的两边一个是i++一个是++i,先后对这两个运算后,i的结果为6,然后在计算中间的加号即为6+6=12,此时i为6。我们将同样的运算法则应用到对最后一个元素的加法,此时i先运算i++,因为是后加所以此时i的值并不改变任然为6,故k=6+6+6=18。对于i的结果,就是不管是前增运算还是后增运算,因为都是运算完输出,所以i的只加三次1,即为8.