百度空间 | 百度首页 
 
查看文章
 
疑惑与发现--关于C#的右自增运算符
2008-04-23 13:51
昨天修改一个程序,发现了一个奇怪的结果,微软.net下的C#在将右自增和赋值同时使用时,赋值会先进行这没什么疑问,但赋值完毕后,自增并没有执行,结果就是变量将保持不变。起初还不敢肯定是语言或是编译器的问题,所以又去写了点测试的代码如下:
static void Main(string[] args)
        {

            for (int i = 0, j = 0; i < 100; i++)
            {
                j = j++;
                Console.WriteLine(j);
            }
            Console.Read();
        }
显然直观的结果是起初J=0,然后j赋值给j,再自增,那么输出就会从1开始直到100.但其实运行后结果一直是0.
不大记得其他语言是不是也如此了,所以又用 C语言测试了下:
int main(){

for(int i=0,j=0;i<100;i++)
{
       
        j = j++;
        printf("%d\n",j);


}
return 0;
}
结果是正确的1-100,所以基本上可以肯定是C#或者C#编译器的不同了,忽又一想,不对,难道是.net托管下都如此么?于是
在托管下建立了C++程序:
int main(array<System::String ^> ^args)
{
    for(int i=0,j=0;i<100;i++)
{
       
        j = j++;
        Console::WriteLine(j);


}
   
    Console::Read();
    return 0;
}

答案仍然是1~100,所以结论就是C#的编译器不会处理(由于C#不是公共标准语言,所以以编译器为准因该就是标准了)赋值时的右自增,那么减呢,类似的右运算符呢?
可能有人觉得奇怪既然要自增j,为啥要写成j=j++;直接写j++不就得了?其实有时是有特殊需求,要在原来j的自增基础上决定下个j的大小和范围,举了例子:j=(++j)&3,将j限制在0~3,并每次自增,当然分开写也可以
++j;
j=j&3;
分开写有助于施加断点,便于调试,但如果这段代码太多,会很污染程序,而且现在计算机硬件能力很强,对单条语句可能有所优化,不过总的来说还是个人喜好(有点跑题了呵呵),好了就说这么多了,如有朋友知道C#是否有这个规定什么的,可以跟我交流交流,问题虽然小,但是如果有时候不明就理还是很难搞明白,本人用的是VS2008不知道其他版本是否相同了。
后来一位仁兄用MSIL(微软中间语言)分析了这个过程,有兴趣的可以参考.以下是连接:
http://hi.baidu.com/doyle/blog/item/435b33fa33e1b118a8d311bb.html

类别:学习 | 添加到搜藏 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
1
2008-05-02 23:49 | 回复
学习了
 
2
2008-07-24 11:19 | 回复
http://hi.baidu.com/doyle/blog/item/435b33fa33e1b118a8d311bb.html
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu