运算符有感

在SegmentFault网上看问题的时候(这个网站是真的厉害,以前很多问题在上面看到答案就跑到这网站上来闲逛),看到别人发的一个知乎的链接,就点进去看,https://www.zhihu.com/question/20127472/answer/17925170,发现这个问题我以前也不知道,挺有趣的。

摘取几个我觉得不错的回答句子:

1.这个时候 EMCAScript 解析器会认为 alert 是个「引用类型(Reference Type)」,那么它将会在当前作用域(默认为 window)去寻找这个引用类型引用的值,那么 windows.alert 自然是个函数。

同时,他留下了这个问题:

* [1,2,3][0||1,2]
* [1,2,3][1,2||3]
* ("hello","world")[1,2,3]

这个问题放到后面解决

2.不是括号的问题,是逗号运算符。
多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
这是从C语言借鉴过来的属性。

看到他的回答,我就去搜索了一下逗号运算符,看到百度百科上举了这个例子:

int a1,a2,b=2,c=7,d=5;
a1=(++b,c--,d+3);
a2=++b,c--,d+3;

对于给a1赋值的代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是(d+3)的值,为8,所以a1的值为8。

对于给a2赋值的代码,也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=4(第2行代码运算完时,b=3,即第3行代码运行时,b的值为4)。

这里要注意的几点,首先,它虽然是只得到最后的表达式,但是这种++他还是会计算(自己得出的结论),其次,如果没有()括号运算符之后,他就直接得到第一个表达式了,这应该是运算符的优先级问题。

第三个人的回答:

这既不是什么“遗留问题”,也不是什么“故意”设置,是因为你对整个js的体系完全不了解,建议先放下来多看书,别急着提问,了解大局后就不会有这种问题了。
----
在(1,2,3)里,括号和逗号都是运算符,逗号运算符返回最后一个表达式的求值结果,具体规则可自己查。
("Amazing")的括号表示函数调用。
alert是一个函数对象,当它作为表达式的求值结果返回,当然可以被调用。

[1,2,3]这里的方括号是声明数组常量,紧跟[1]表示取数组元素。[1,2,3][1]意为取[1,2,3]这个数组里的第一个元素,即2(下标从0开始)

[1,2,3][1,2]=[1,2,3][(1,2)]=[1,2,3][2]=3;

 

汗!哎,看来我就是他说的那个对整个js的体系完全不了解的人了,不过他这个回答最近人意吧,直接解释,看了他的基本就明白啦。

最后总结:逗号整个表达式的值是最后一个表达式的值。但是遇到++的时候还是会计算,如果没有()括号运算符就会直接得到第一个表达式的值。那么问题来了,第一个回答下那个人的问题怎么解:

* [1,2,3][0||1,2]
* [1,2,3][1,2||3]
* ("hello","world")[1,2,3]

忧伤,又出来个新的||运算符,得,又不知道结果啦,百度下先。

 条件运算符具有右结合性

当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。

例如:
w<x ? x+w : x<y ? x : y
与 w<x ? x+w : ( x<y ? x : y) 等价
与 (w<x ? x+w : x<y) ? x : y 不等价

但若在java语言里,JAVA中条件表达式的值必须参与运算。

publicclassdemo{
    publicstaticvoidmain(String[]args){
        inta=10,b=20,y;
        a>b?(y=a):(y=b);//1,这样写是错误的
        y=a>b?a:b;//2,这样写是正确的
        y=a<b?b:b<c?a:c;//3,这样写是正确的
    }
}        

以上程序中,1处错误是由于条件表达式的值没有参与运算,不能构成语句。3处(b<c?a:c)先结合,再将这个值参与到另一个条件运算中去,是合法的,这也说明了条件运算符的右结合性。    

运算符妙用

——用条件表达式判断输出单词的单复数。

程序示例:ChooseDemo05.java

程序中会自动根据apples的个数来输出单词的单数或复数。

publicclassChooseDemo05{
    publicstaticvoidmain(String[]args){
        intapples=1;//苹果的个数
        System.out.println("Ihave"+apples+"apple"+(apples==1?".":"s."));
    }
}

1、 在某些地方使用“他”还是“她”。当然,还有其他的应用:

2、日期输出时决定使用后缀“st”、“nd”等。

然而看完这个词条我还是没得到||运算符的一些消息。

我又找了一会,还是没有找到答案,于是我就自己试,发现我暂时的结果是,||运算符一般会取前面这个数,如:1||5,会取得1,但是当前面这个数为0时,会取得后面这个数,当两个数都为0时,则会取得0,我还不知道为什么,但是暂时我试了几次都是这样。("hello","world")[1,2,3],这个当然后面会取得3,前面的话,我试了下,他会取第后面这个数,即world,那么3就是获得这个词第三个字母,即l。这些是我实验的发现。

好记性不如烂笔头,看到自己觉得应该记录的知识点,结合自己的理解进行记录,用于以后回顾。
原文地址:https://www.cnblogs.com/wangxi01/p/8075592.html