黑马程序员技术交流社区

标题: 关于一元运算符和二元运算符 [打印本页]

作者: Always.    时间: 2013-9-20 23:53
标题: 关于一元运算符和二元运算符
本帖最后由 Always. 于 2013-9-21 16:15 编辑

像我们所说的一元运算符有:++、--等,而++有前加(++age)和后加(age++)之分。
前加:
int age=18;
int sum=age++-10;
Console.WriteLine("sum={0},age={1}",sum,age);
此时得到的值为:sum=8,age=19(先计算-得到到sum的值,再进行++)

后加:
int age=18;
int sum=++age-10;
Console.WriteLine("sum={0},age={1}",sum,age);

此时得到的值为:sum=9,age=19(先++,再进行-才得到sum的值)

而在视频里,老师说在C#中,一元的优先级大于二元的优先级。也就是先进行前加前减再进行加减乘除,而后加后减的优先级又大于前加前减,
那为什么在sum=age++-10这个表达式中是先进行二元运算符的运算然后再进行一元的呢 ?
这个问题困扰了我挺久,望各位学长能帮我解答一下!

作者: 许庭洲    时间: 2013-9-21 07:45
1.int age=18; int sum=++age-10, 右边的表达式分为两个部分,表达式一为++age和已经有结果的表达式二数值10,表达式一的最后运算结果为19, 所以赋值运算符号左边的表达式运算结果就是19-10=9, 然后将9赋值给变量sum;

2.int age=18; int sum=age++-10, 右边的表达式分为两个部分,表达式一为age++和已经有结果的表达式二数值10,表达式一的最后运算结果为18, 所以赋值运算符号左边的表达式运算结果就是18-10=8, 然后将8赋值给变量sum;
作者: haxyek    时间: 2013-9-21 09:15
age++就是先把运算做完了,再自己加1;
++age先把自己加1做完了,在做运算。
作者: yueyp    时间: 2013-9-21 10:23
age++: 规则是在表达式中先取age的值使用,后让age的值变成加1后的值
++age: 规则是在表达式中先让age的值变成加1后的值,在取age的值使用
作者: Always.    时间: 2013-9-21 10:29
许庭洲 发表于 2013-9-21 07:45
1.int age=18; int sum=++age-10, 右边的表达式分为两个部分,表达式一为++age和已经有结果的表达式二数值1 ...

恩恩,学长说的是这样的,能够明白,但是我的问题还是木有解决啊在sum=age++-10 这个表达式中,是有一元运算符也有二元运算符, 而一元的优先级大于二元的优先级 ,理应先算一元的再算二元的,但是因为是后加,所以先算了二元的。是不是跟我们所说的“当一元的优先级大于二元的优先级的时候,先算优先级高的” 有点自相矛盾 ?





作者: Always.    时间: 2013-9-21 10:34
我知道age++和++age的区别。嘻嘻
作者: 大虾挂了    时间: 2013-9-21 11:05
Always. 发表于 2013-9-21 10:29
恩恩,学长说的是这样的,能够明白,但是我的问题还是木有解决啊在sum=age++-10 这个表达式中,是有一元 ...

饿。。。。
你的想法好有趣,当时这里我没想那么多,就当就把后加永远当做最后进行运算的就行,你要硬说他优先级低,也是一种理解方式?那后加应该是所有运算符中优先级最低的?

作者: haxyek    时间: 2013-9-21 12:25
Always. 发表于 2013-9-21 10:29
恩恩,学长说的是这样的,能够明白,但是我的问题还是木有解决啊在sum=age++-10 这个表达式中,是有一元 ...

这个跟优先级没关系,这个是计算时候的次序。我们知道括弧的优先级最高,
那么看
int sum = (age++) - 10;
这样输出的结果依然是

sum=8,age=19



作者: 追寻Dream    时间: 2013-9-21 13:40
sum=age++-10;age++在参与运算的时候,age++取原值,
作者: 追寻Dream    时间: 2013-9-21 13:42
sum=age++-10;age++在参与运算的时候,age++取原值,++age取新值,这就是前加和后加的区别。
作者: -___Is、_C    时间: 2013-9-21 15:01
当时看的什么还真没想这些,就记住了前加(前减)取新值,后加(后减)取原值。
作者: Always.    时间: 2013-9-21 15:08
大虾挂了 发表于 2013-9-21 11:05
饿。。。。
你的想法好有趣,当时这里我没想那么多,就当就把后加永远当做最后进行运算的就行,你要硬说 ...

不是那样,后加是一元运算符。一元运算符比二元运算符的优先级要高

作者: Always.    时间: 2013-9-21 15:11
haxyek 发表于 2013-9-21 12:25
这个跟优先级没关系,这个是计算时候的次序。我们知道括弧的优先级最高,
那么看
int sum = (age++) - 10 ...

怎么会没关系?运算法则不就是根究优先级来的么 ?
可不可以理解为那是一种特殊情况 ?
不然 我会一直卡在那里

作者: 黑色海    时间: 2013-9-21 15:35
本帖最后由 黑色海 于 2013-9-21 15:56 编辑

先明白,优先级就是指参与运算时的运算顺序,谁先运算,谁的优先级就高
a++先运算后自增操作数,说明它的优先级高
++a先自增操作数再运算,说明它的优先级低
int a=10,b=10;
a=a++;
b=b+1;
Console.WriteLine(a);   
Console.WriteLine(a++);
Console.WriteLine(b);
Console.WriteLine(a);
前两次a输出值是10,最后一次输出11,b输出值是11;
说明,a++是先运算后自增的。
a++属于基本运算符,它的优先级高过++a(一元运算符);
如果不能理解,记住就行了。

作者: Always.    时间: 2013-9-21 16:14
黑色海 发表于 2013-9-21 15:35
先明白,优先级就是指参与运算时的运算顺序,谁先运算,谁的优先级就高
a++先运算后自增操作数,说明它的优 ...

OK,I see,Thanks a lot

作者: 宋清飞    时间: 2013-9-23 23:25
       楼主的疑问应该是为什么在“sum=age++-10”中,二元运算符“—”会先于一元运算符“age++”进行运算。       我的看法是这样的,在这里二元符并没有先于一元符进行运算,老师所讲的优先级规则在这里完全适用,只是在这个式子里体现不出来而已。
       在此式中:
              一元符的运算规则是  “先进行二元运算,然后age加1”
              二元符的运算规则是  ”等待age++先执行,再将age++和10相减去“。
      在这个式子里无论你先执行哪种运算,从表面上看,运算方式和结果都是一样的。这样讲不知道是不是你想要的答案,如果没明白我还可以举一个沉船逃生的例子更形象一些。

作者: 宋清飞    时间: 2013-9-23 23:56
黑色海 发表于 2013-9-21 15:35
先明白,优先级就是指参与运算时的运算顺序,谁先运算,谁的优先级就高
a++先运算后自增操作数,说明它的优 ...

运行了你的代码后,突然发现这个后加加自增的时间点有点复杂,把握不了。不过我作为初学者,我觉得理解程度应该够了吧,我也许暂时没必要把过多的精力放在这个小问题上。

作者: Always.    时间: 2013-9-24 00:13
宋清飞 发表于 2013-9-23 23:25
楼主的疑问应该是为什么在“sum=age++-10”中,二元运算符“—”会先于一元运算符“age++”进行运算 ...

想了会,还是不明白 ?不知道你所说的一元符的运算规则是  “先进行二元运算,然后age加1”,二元符的运算规则是  ”等待age++先执行,再将age++和10相减去“。在这里是何意 ?

作者: 宋清飞    时间: 2013-9-24 13:06
Always. 发表于 2013-9-24 00:13
想了会,还是不明白 ?不知道你所说的一元符的运算规则是  “先进行二元运算,然后age加1”,二元符的运 ...

age++的规则可以看做是执行其他运算后再自增1,在这个是式子里,按老师讲的优先级规则应该先执行age++,那在这里age++的运算规则,或者说运算方法是什么?方法就是“等待减法运算完成再自增1”.一艘大船要沉了,救生设施有限,先离开船的人生存机会更大。这时候有船长可能会有两种决定:
1.让妇孺先走,男人次之。
2.让妇孺先决定谁先走,男人次之。
第一中情况下很好理解,按规则来,结果一定是妇孺先走了。
第二种情况的话,结果是什么?结果可能是妇孺先走,或者是男人先走了。
有人会不解为什么优先权在女人手里。结果却有可能是男人先走了。那是因为他们默认了一个条件,就是他们认为在这种情况下,人们一定会决定让自己先走。
回到运算符的问题上,你之所以对这个问题不解,是因为你心理默认了一个条件,那就是,当一个运算符开始执行的时候,它做的第一件事一定是对自己的操作数进行操作。
沉船中,不解的人忽略了,会有那么个别的妇孺会因为种种原因,决定让男人先走。
在运算符问题中,你忽略了,会有那么几个运算符,它们的规则就是先让其它运算符运算,然后在操作自己。(例如age++)
这种运算规则和传统意义上的加减乘除有很大不同。

如果实在搞不清楚,就只能记住吧,优先级规则这里是适用的,只是没有体现出来而已。毕竟在这个小地方浪费太多精力,得不偿失。


作者: 宋清飞    时间: 2013-9-24 13:24
翻了翻书,找到两句书上原话,可以帮助理解(返回变量值就是要在表达式里需要用的值)。

前置递增++var           描述(变量的值加1并保存,返回变量的值)
后置递增var++           描述(变量的值加1并保存,返回变量递增之前的旧值)
作者: 七里香    时间: 2013-9-24 14:54
Always. 发表于 2013-9-21 10:29
恩恩,学长说的是这样的,能够明白,但是我的问题还是木有解决啊在sum=age++-10 这个表达式中,是有一元 ...

其实视频里面关于优先级是有一点小错误的。真正的优先级应该是这样哦


作者: 七里香    时间: 2013-9-24 14:55
不过如果实在搞不清楚优先级该怎么办呢?加括号一切都搞定了{:soso_e152:}
作者: Always.    时间: 2013-9-24 18:39
七里香 发表于 2013-9-24 14:55
不过如果实在搞不清楚优先级该怎么办呢?加括号一切都搞定了

每个回复我都看了一次,只有这个我好像能够接受。比较能够想通。
以后多教教我。嘻嘻





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2