412永利皇宫取而代之的是需要用方法调用的场景就越多

当前位置:永利皇宫463线路是多少 > 412永利皇宫 > 412永利皇宫取而代之的是需要用方法调用的场景就越多
作者: 永利皇宫463线路是多少|来源: http://www.bharatsharma.net|栏目:412永利皇宫

文章关键词:永利皇宫463线路是多少,操作符

  一直以来理解的operator无非算术运算符、逻辑运算符、位运算等等,但是在C++中,new、new[]、delete、delete[]、 typei…

  C++的话预定义的运算符(不是函数调用)与用户重载的运算符(是函数调用)有些小语义差异,例如sequence point相关;又例如像sizeof()运算符接受的参数可以是“类型”(例如int、MyClass),而这些“类型”不是一般的合法的表达式,所以不能作为一般函数调用的参数。

  提供运算符最重要的好处是其特殊的语法规则:多数运算符都是二元的,而二元运算(特别是在算术、逻辑、比较等场景)很自然的记法是

  许多语言都会提供一套固定的可重载的中缀运算符,然后为这套运算符提供固定的优先级与结合性规定;

  也有些更灵活的语言可以让用户自定义运算符优先级与结合性,例如Haskell;

  还有许多人觉得奇葩的语言,虽然有运算符但是却没有优先级或结合性,例如Smalltalk:3 + 4 * 5在Smalltalk里是(3 + 4) * 5的意思。

  的语言,像是Forth、Factor、Cat啥的,412永利皇宫不需要中缀记法的运算符语法,也不需要前缀记法的函数调用语法,412永利皇宫而是统一用后缀记法。

  再举一例,Haskell可以用``符号把前缀记法的函数变为中缀的,例如本来要写:

  这种转换对“接受两个参数”的函数比较方便,对接受更多参数的函数虽然也可以用不过没那么爽,还是得加括号(而且加在了

  =========================================================

  话说回来,很多对LISP不熟悉的人喜欢吐槽LISP括号多。然而不能重载运算符的Java,代码里的括号其实跟LISP差不多多…

  Java的运算符基本上在primitive type的算术运算多的地方才会显著降低括号的个数;在越“面向对象”的Java里,预定义的运算符能用上的场景就越少,取而代之的是需要用方法调用的场景就越多。

  基于C的语法的面向对象语言常用hod(args)的记法来调用对象上的方法,其实就是一种变通的把方法名放在近似“中缀”位置上的做法。

  如果把receiver放回到普通参数列表里的话,变为method(receiver, args),412永利皇宫可以看到这种记法本质上跟LISP用的前缀记法一模一样——只有一个固定个数的参数被挪到了括号前面而已。

  (Objective-C的面向对象部分的语法源自Smalltalk,虽然是方括号的但“括号个数”上也没啥区别)

  =========================================================

  Haskell处理自定义优先级和结合性的实现挺有趣的。GHC的Renamer会做相关处理:

  Sort out fixities. The parser parses all infix applications as left-associative, regardless of fixity. For example a + b * c is parsed as (a + b) * c. The renamer re-associates such nested operator applications, using the fixities declared in the module.

  还是Haskell对运算符的定义比较清晰,就是带优先级和结合性的函数,只要给函数定义优先级和结合性,纯函数就变运算符了。

  不像某语言没有运算符,或者运算符就是函数,并且根据函数名首字母(字符)来规定优先级,结合性则是最后一个字符决定的,以:结尾的就是右结合

  有些语言支持用符号给函数命名. 因此如果将 add 改为 +, 就可以得到

  操作符跟函数还是有区别的,操作符不只是函数的语法糖。操作符是可以短路的,而函数一般不会。操作符其实更像是for,while,if,goto这样的语法控制结构,而不是更像是函数。一门语言缺少一些内置函数并不会限制它的表达能力,但是缺少一些特定的操作符,就会限制其表达能力了。

  都是执行逻辑或操作,使用操作符和使用宏定义(本质还是展开成操作符)的都是可以整却求值的,但是自定义的函数 ”myor“ 就会陷入无限循环之中。

  当能够用函数调用的语法实现短路操作时,你就获得了 “自定义语法结构” 的力量。要么就是用宏,要么就要惰性求值(lazy evaluation),这两个,一个是lisp,一个是haskell

  操作符就是函数的语法糖吧!+和add没有本质的区别。尤其在一些奇葩的语言中,+常做前缀调用,那完全就是函数,一个名字是特殊字符+的函数。

  有些看起来像是函数的东西,其实是个运算符,例如new、sizeof、typeof等。

  操作符是函数的根基,函数是复合结构,基本构件是操作符(在函数式语言里这基本全面了,在命令式语言里有statement得在加上控制语句)。这些根基很多直接对应cpu指令,没有根基如何构建函数呢。

  这就跟类型系统差不多,一般语言会提供一些基本类型作为根基,在这之上你可以扩展类型。class作为复合结构的类型。

  当然很多语言都提供了运算符重载,让你自定义函数重载运算符。类型系统也差不多,比如java的auto box,auto unbox。

网友评论

我的2016年度评论盘点
还没有评论,快来抢沙发吧!