++ 符号

关于++符号(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.csdn.net/zlhy_/article/details/8349300

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值