zoukankan      html  css  js  c++  java
  • 运算符有感

    在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。这些是我实验的发现。

    好记性不如烂笔头,看到自己觉得应该记录的知识点,结合自己的理解进行记录,用于以后回顾。
  • 相关阅读:
    .NET自动化测试手记(2) 实例:点击计算器按钮
    解决httpwebrequest无法通过使用代理的局域网获取response的问题
    iOS开发之SQLite
    iOS开发之AVAudioPlayer 音频播放
    iOS开发 键盘添加工具条(toolbar)
    UIPickerView中的实例方法
    TextField
    UISearchBar和UISearchDisplayController
    Objectivec 字符串遍历的几种方法
    《Write ObjectiveC Code》学习笔记
  • 原文地址:https://www.cnblogs.com/wangxi01/p/8075592.html
Copyright © 2011-2022 走看看