c#的关于自减运算符

发布时间:2024-05-09 13:41 发布:上海旅游网

问题描述:

class Program
{
static void Main(string[] args)
{

int x = 9;
Console.WriteLine((x--) + (x--));
Console.WriteLine(x);

int y = ((--x)+(--x));
Console.WriteLine(y);
Console.WriteLine(x);

}
}
}

运行了一个这个程序,最后结果是17,7,11,5

关于第一个表达式, 我是这样理解的((x--)+(x--))也就相当于(((X= X-1)+( X=X-1)).,那么就应该是8+7=15呀.

想请教一下,能帮忙分析一下这四个Console.WriteLine表达式吗?

问题解答:

晕。。--x 和x-- 的区别就是--x 先自身减去1,再使用X的值
x--的区别是先使用X的值,再自身减1

所以第一句就是 9+8; 此时x为7了
第二句 7
第3句 6+5 此时X为5
第4句 5

class Program
{
static void Main(string[] args)
{

int x = 9;
//第一个x先进栈:x=9(副本),然后自减:x=8;第二个x再进栈:x=8;再自减:x=7;所以第一次输出:9+8=17;第二次输出:7
Console.WriteLine((x--) + (x--));
Console.WriteLine(x);

//第一个x自减:x=6;进栈:x=6;第二个x自减:x=5;进栈:x=5;所以y=6+5=11;所以第三次输出y=11;第四次输出5
int y = ((--x)+(--x));
Console.WriteLine(y);
Console.WriteLine(x);

}
}
}

上面说得很对

1楼简直瞎扯```~ 看了答案在这里瞎搅和~~垃圾

这个东西不是那么简单的,C++里并没有规定表达式的求值顺序,比如:
a=f(1)+g(1)这个表达式,随编译器的不同到底是先求f还是先求g可以完全不同的,所以按上面各位的答案是无法解释的。
其实这个东西也不难,x--就等价于逗号表达式(t=x,x-=1,t)同理x++就等价与逗号表达式(t=x,x+=1,t),这里的t是一个临时变量,而且编译器保证前面他没有被用过,而--x则等价与x-=1,同理++x等价于x+=1;
那么这时((x--) + (x--))这个式子我们设前后两个(x--)分别为a和b,他们到底那个先计算不知道,由编译器决定,但是有一点肯定,那就是必然一个先一个后,只有a和b都算完,才能算a+b。下面:
x=9;
a=(t=x,x-=1,t);
b=(f=x,x-=1,f);
其中t好f都是临时变量且都未用过。
设a先算,则a=9,因为逗号表达式的值等于最后一个逗号之后的表达式的值,但是此时逗号表达式的第二个部分即x-=1也因为逗号表达式计算的完成而完成,所以此时x已经等于8了,那么接下来b就等于8了,而x也就变成7了,最后a+b就等于9+8即17;
如果b先算,则同理,也是17.

以上的分析是我自己琢磨出来的,不敢保证完全正确,不过C++对表达式中子表达式的求值顺序没有给出明确规定这一点是肯定的,自增和自减运算的等价形式也是没问题的,因为是C++之父就这么解释的。

热点新闻