`
xf986321
  • 浏览: 163937 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

操作符表达式

阅读更多

操作符表达式

例:

1+2*3/4

为了便于编程,有些方法调用和控制结构是以操作符的形式出现的。Ruby语言中有下列操作符。

高     ::
[]
+(单项)  !  ~
**
-(单项)
*  /  %
+  -
<< >>
&
|  ^
> >=  < <=
<=> ==  === !=  =~  !~
&&
||
..  ...
?:(条件操作符)
=(+=, -= ... )
not
低     and or

左侧的“高”和“低”表示操作符的优先度。例如“&&”的优先度要高于“||”,所以

a && b || c   #=> (a && b) || c
a || b && c   #=>  a || (b && c)

大部分操作符都是些特殊形式的方法调用,但有的操作符被嵌入语言之中,无法进行再定义。

  • 可再定义的操作符(方法):

    +@ , -@ 表示单项操作符+ , - ,在方法定义等场合中可以使用这种表示法。

    |  ^  &  <=>  ==  ===  =~  >   >=  <   <=   <<  >>
        +  -  *  /    %   **   ~   +@  -@  []  []=  `
        
  • 不可再定义的操作符(控制结构):

    由多个操作符组合而成的计算赋值操作符、“!=”以及“!~”是不能再定义的。

    =  ?:  ..  ...  !  not  &&  and  ||  or  ::
        

赋值

例:

foo = bar
foo[0] = bar
foo.bar = baz

语法:

变量 '=' 表达式
常数 '=' 表达式
表达式`['expr..`]' '=' 表达式
表达式`.'标识符 '=' 表达式

我们使用赋值表达式向变量等对象进行赋值。赋值也可以用作局部变量和常数的声明。赋值表达式的左边必须是下列之一。

  • 变量

    变量 `=' 表达式
        

    若左边是变量的话,就将表达式的计算值代入其中。

  • 数组调用

    表达式1`[' 表达式2 ... `]' `=' 表达式n
        

    先计算表达式1得到一个对象,再把从表达式2到表达式n之间的这些表达式作为参数,来调用该对象的"[]="方法。

    例:

    class C
        def initialize
        @ary = [0,1,2,3,4,5,6,7]
        end
        def [](i)
        @ary[i * 2]
        end
        def []=( i, v )
        @ary[i * 2] = v
        end
        end
        c = C.new
        p c[3]      # 变成 c.[]( 3 ), 结果为6
        p c[3] = 1  # 变成 c.[]=(3,1),结果为1
        
  • 属性调用

    表达式1 `.' 标识符 `=' 表达式2
        

    计算表达式1得到一个对象,再以表达式2为参数来调用该对象的"标识符="方法。

    例:

    class C
        def foo
        @foo
        end
        def foo=( v )
        @foo = v
        end
        end
        c = C.new
        c.foo = 5   # 变成 c.foo=( 5 )
        p c.foo     # => 5
        

    还可以使用 attr 来定义属性。

    例:

    class C
        attr :foo, true
        end
        c = C.new
        c.foo = 5   # 变成 c.foo=( 5 )
        p c.foo     # => 5
        

计算赋值

例:

foo += 12       # foo = foo + 12
a ||= 1         # 若a为伪或者a尚未定义,就把1赋值给a。初始化时的一种习惯写法。

语法:

表达式1 op= 表达式2     # 表达式1等同于普通赋值表达式左边的部分

op就是下列中的某一个。操作符与= 之间不留间隔。

+, -, *, /, %, **, &, |, ^, <<, >>, &&, ||

这种赋值形式等同于

表达式1 = 表达式1 op 表达式2

但是,当op 是“&&”或“||”时就会变成

表达式1 op (表达式1 = 表达式2)

这个样子。例如在属性调用时

obj.foo ||= true

就不能解释成

obj.foo = obj.foo || true

而应该是

obj.foo || (obj.foo = true)

这样才对。(根据obj.foo结果的不同,有时就不能调用obj.foo=)

多重赋值

例:

foo, bar, baz = 1, 2, 3
foo, = list()
foo, *rest = list2()

语法:

表达式 [`,' [表达式 `,' ... ] [`*' [表达式]]] = 表达式 [, 表达式 ... ][`*' 表达式]
`*' [表达式] = 表达式 [, 表达式 ... ][`*' 表达式]

多重赋值是指,在多个表达式以及数组中同时进行的赋值。左边的各个表达式必须是可以被赋值的。若右边只有一个表达式时,则将该表达式的计算值转为数 组后,再把数组中的各个元素依次赋值给左边。若右边数组元素的数量超过左边的话,将忽略多余的数组元素。若右边数组元素个数不足的话,将向左边多余的元素 中代入nil。

若左边最后一个表达式前带*的话,则将右边多余的元素以数组的形式代入这个带*的表达式中。若右边没有多余元素的话,就把空数组代入其中。

例:

foo, bar = [1, 2]       # foo = 1; bar = 2
foo, bar = 1, 2         # foo = 1; bar = 2
foo, bar = 1            # foo = 1; bar = nil
foo, bar, baz = 1, 2    # foo = 1; bar = 2; baz = nil
foo, bar = 1, 2, 3      # foo = 1; bar = 2
foo      = 1, 2, 3      # foo = [1, 2, 3]
*foo     = 1, 2, 3      # foo = [1, 2, 3]
foo,*bar = 1, 2, 3      # foo = 1; bar = [2, 3]

在多重赋值过程中,若使用括号的话,就可以把数组内含的元素取出来进行赋值。

(foo, bar), baz = [1, 2], 3       # foo = 1; bar = 2; baz = 3

还可以把特殊形式的赋值表达式转化为多重代入。

class C
def foo=( v )
@foo = v
end
def []=(i,v)
@bar = ["a", "b", "c"]
@bar[i] = v
end
end
obj = C.new
obj.foo, obj[2] = 1, 2     # @foo = 1; @bar = ["a", "b", 2]

若左边以","结尾或"*"后面没有表达式时,将忽略右边多余的元素。

例:

foo,*    = 1, 2, 3      # foo = 1
foo,     = 1, 2, 3      # foo = 1
*        = 1, 2, 3

当您想忽略方法调用中的所有参数时,就可以使用这个"*"(方法调用 中的参数在进行交接时,大体遵循多重代入的规则)。

例:

def foo(*)
end
foo(1,2,3)

多重赋值的值变换为右边的数组。

范围表达式

例:

1 .. 20
/first/  ...  /second/

语法:

表达式1 `..' 表达式2
表达式1 ` ... ' 表达式2

如果不是出现在条件表达式中的话,它将返回从表达式1到表达式2的范围对象。范围对象是 Range 类的实例。使用"..."生成的范围对象将不包括终点。

若它出现在条件表达式中时,在表达式1变成真之前,它将一直返回伪。接下来,在表达式2返回真之前,它将一直返回真。一旦表达式2变为真,它将重新 返回伪。使用".."时,一旦表达式1返回真,马上就会对表达式2进行计算(就象awk)。而使用"..."时,在进行下个计算之前,一直都不会对表达式 2进行计算(就象sed)。

and

例:

test && set
test and set

语法:

表达式 `&&' 表达式
表达式 `and' 表达式

首先计算左边,若结果为真就接着计算右边。"and"操作符的作用相同但优先度更低。

将包含and 的表达式传递给某方法的参数时,必须使用双层括号。

p(true && false)    #=> false
p((true and false)) #=> false

or

例:

demo || die
demo or die

语法:

表达式 `||' 表达式
表达式 or 表达式

首先计算左边,若结果为伪就接着计算右边。"or"操作符的作用相同但优先度更低。

将包含or 的表达式传递给某方法的参数时,必须使用双层括号。

p(false || true)    #=> true
p((false or true)) #=> true

not

例:

! me
not me
i != you

语法:

`!' 表达式
not 表达式

若表达式值为真就返回伪,若表达式值为伪则返回真。

表达式 `!=' 表达式

等同于!(表达式 == 表达式)

表达式 `!~' 表达式

等同于!(表达式 =~ 表达式)

将包含not 的表达式传递给某方法的参数时,必须使用双层括号。

p(! false)      #=> true
p((not false))  #=> true

条件操作符

例:

obj == 1 ? foo : bar

语法:

表达式1 ? 表达式2 : 表达式3

根据表达式1的结果,选择返回表达式2或表达式3。它与

if 表达式1 then 表达式2 else 表达式3 end

分享到:
评论

相关推荐

    C A Reference Manual 5th edition

    - **二元操作符表达式**:介绍了二元操作符表达式的定义和使用方法,包括算术运算、位运算、比较运算等。 - **逻辑操作符表达式**:讲解了逻辑操作符表达式的定义和使用方法,包括逻辑与、逻辑或等。 - **条件表达式...

    C++后缀表达式转前缀表达式

    为了完成这个操作,我们需要使用栈数据结构来存储和处理表达式中的操作符和操作数。 首先,让我们了解一下什么是后缀表达式和前缀表达式。后缀表达式是一种表达式形式,其中操作符写在操作数之后,例如:a+b*c。...

    OracleSQL的优化.pdf

    优化器把使用 LIKE 操作符和一个没有通配符的表达式组成的检索表达式转换为一个"="操作符表达式。例如,优化器会把表达式 `ename LIKE 'SMITH'` 转换为 `ename = 'SMITH'`。优化器只能转换涉及到可变长数据类型的...

    陈宝峰视频-Java基础-03.操作符与表达式

    陈宝峰视频-Java基础-03.操作符与表达式 wmv格式

    C#写的表达式解析器,同时支持一元操作符和二元操作符,可自定义操作符,同时能设置表达式中的变量

    C#写的表达式解析器,支持多种操作符 如加减乘除幂模,同时还支持正负、三角函数,随机值等函数,可以支持自己扩展操作符,同时能支持设置表达式中的变量.表达式使用的是逆波兰式(中缀表达式转换成的后缀表达式),非递归...

    常用comsol的操作符和数学函数.pdf

    COMSOL 操作符和数学函数 COMSOL 是一款多物理场仿真软件,提供了丰富的操作符和数学函数来帮助用户建立和求解复杂的数学模型。下面是 COMSOL 中常用的操作符和数学函数: 1. 微分算符 d(f,x):计算变量 f 对 x ...

    中缀表达式转后缀表达式树

    中缀表达式是我们日常数学运算中常见的形式,如 "2 + 3 * 4",而后缀表达式,也称为逆波兰表示法,将操作符放在操作数之后,如 "2 3 4 *",它便于解析和计算。这种转换在计算和编译器设计中很有用,因为后缀表达式...

    ruby教程.rar

    操作符表达式 控制结构/异常处理 方法调用 类/方法的定义 标准库 内部函数 内部变量 内部常数 内部类/模块/异常类 附加库 Ruby变更记录 ruby 1.6 特性 ruby 1.7 特性 ruby 1.8 特性 1.6.8到1.8.0...

    中缀表达式改后缀表达式运算

    - 如果当前操作符优先级低于栈顶操作符,将栈顶操作符弹出并添加到后缀表达式,直到栈为空或栈顶操作符的优先级低于当前操作符,然后将当前操作符压入栈。 - 遇到左括号 '(',将其压入栈。 - 遇到右括号 ')',则...

    基于栈实现的中缀表达式转换为后缀表达式

    1. **中缀表达式**:在日常数学运算中,我们习惯使用中缀表达式,即操作符位于操作数之间。例如,"2 + 3 * 4" 就是一个中缀表达式,其中"+"和"*"是操作符,"2", "3" 和 "4" 是操作数。 2. **后缀表达式(逆波兰表示...

    表达式二叉树的操作

    表达式二叉树,也称为运算符树或操作符树,是一种特殊的二叉树结构,主要用于表示数学表达式。在计算机科学中,特别是在编译器设计、解析算法和符号计算等领域,表达式二叉树扮演着重要角色。下面将详细阐述表达式...

    将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出

    将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出,这是一个常见的算法问题。下面我们将通过详细的解释和示例代码来介绍如何实现这种转换。 首先,需要明确什么是表达式树...

    中缀表达式变后缀表达式的求值

    首先,我们需要扫描整个中缀表达式,遇到数字时直接输出,遇到操作符时根据优先级与栈顶操作符进行比较,如果当前操作符优先级更高或者栈为空,则压入栈中;如果当前操作符优先级较低,则将栈顶操作符弹出并输出,...

    表达式语法分析器

    - `Stack OPTR`:操作符栈,存储表达式中的操作符。 - `Stack&lt;String&gt; OPND`:操作数栈,存储表达式中的操作数。 - `int count`:计数器。 - `int[][] list`:操作符优先级表,用于比较操作符之间的优先级。 ##### ...

    C#中缀表达式计算器

    在编程领域,中缀表达式是一种常见的数学表达方式,它以操作符位于操作数之间的形式出现,例如2 + 3 * 4。然而,计算机处理这类表达式时通常使用前缀或后缀(逆波兰)表达式,因为它们更易于通过栈来计算。在C#中...

    java堆栈的应用--中缀表达式转换成后缀表达式和计算

    2. **后缀表达式**(也称为逆波兰表示法):在这种表示法中,操作符紧跟在其操作数之后,例如,上述中缀表达式转换成后缀表达式为 `2 3 4 * +`。这种表示法简化了计算过程,因为不需要括号来明确优先级,而是通过...

    后缀表达式转换和计算

    在转化过程中,我们需要建立一个操作符栈和一个字符数组,用来存放转化以后的表达式。然后,对得到的用户输入的字符串进行扫描,如果是数字或者小数点,则直接存放到数组中,并且在后面加入一个分隔符“|”。如果是...

    C++ 表达式求解 MFC源代码含注释.txt

    大体思路:用两个栈,一个操作符栈,一个数据栈,数据栈存表达式的数据,操作符栈存()+ - * /等。将中缀表达式转换为后缀表达式,在转换的过程中求表达式的值具体步骤如下: 先将一个‘=’放入操作符栈 1:读取...

    用栈解决表达式求值问题(数据结构)

    5. **结束条件**:当所有字符都处理完毕并且操作符栈中只剩下一个结束标志`#`时,表达式的求值过程结束。 6. **返回结果**:最终,操作数栈中将仅剩一个元素,即表达式的计算结果。 #### 示例代码分析 根据给定的...

Global site tag (gtag.js) - Google Analytics