关于++符号(i +=i++)
刚好最近看到一个关于i=i++的测试题就查询资料测试了一下。
int i = 10;
int j = 30;
i = i++;
Console.WriteLine(i);
Console.WriteLine("*******************");
i = ++i;
Console.WriteLine(i);
Console.WriteLine("*******************");
i = i++ + j;
Console.WriteLine(i);
Console.WriteLine(j);
Console.WriteLine("*******************");
i = ++i+j++;
Console.WriteLine(i);
Console.WriteLine(j);
Console.WriteLine("*******************");
Console.ReadKey();
输出如图所示:
简单分析一下,++称为自增运算符;之前有学过的是此运算符的变量,后置i++是先参与运算赋值,后进行自加运算,前置++i是先进行自加运算后赋值。
这里所谓的先参与运算赋值,后进行自加运算,是指将其的变量副本进行运算操作,再对其变量本身进行自加操作。后者指的是变量先进行自加运算,再将其变量副本传入操作运算。
以i=i++为例,其基本等价于:
int temp = i;
i++;
return temp;
i=++i来看:
i++;
int temp = i;
return temp;
以此来看 int i=10; i+=i++
其相当于:
int temp = i;
i++;
temp += temp;
return temp;
总的来说,虽然++ 的指令优先级很高,但是其参与运算的是值副本。所以后置的++不影响运算;
那么 int i=10; i=-i++
也类似于上面所说的,其值为-10;
再引申一点: int p=10; j=p+++p++;
其结果为21;
j=++p+++p;
其结果为23;
那是不是所有编译器都这样呢。
事实时,上述逻辑仅在部分语言(c#,java)中有效,在VC中运行结果和学生时学的一样,最后两个的答案时20和22;这是为什么呢?
一种解释是:“VC/gcc生成的是本地代码,而X86处理器是基于寄存器的架构,也就是如果它要进行了两个数相加,它会先把两个数移到寄存器,再进行加法运算。而Java虚拟机是一种基于栈的架构,如果它要进行两个数相加,它会先弹出两个数,再进行加法运算,再将结果入栈。”等我更深入一些再来评价这种解释。
详见:https://www.cnblogs.com/hustcat/archive/2009/06/02/1494311.html
至此,通过对++符号的理解,更深刻领悟了程序的运行。
(备注)i+++i == (i++)+i,这是由结合方向,贪心法则决定的。
(备注2)关于int* p = &(++q),int* p = &(q++)的问题,.net环境下unsafe后验证均失败;有机会再用其他方式验证,详见: http://blog.youkuaiyun.com/zlhy_/article/details/8349300