联合后期运营商?

时间:2008-10-05 22:41:48

标签: syntax language-features language-design

我们都熟悉增量前和增量后运算符,例如

c++;    // c = c + 1
++c;    // ditto

和扩展这一原则的“联合运营商”:

c += 5;    // c = c + 5
s .= ", world";    // s = s . ", world"; e.g. PHP

我经常需要一个'后组合操作员',这将允许:

s =. "Hello ";    // s = "Hello " . s

显然,这对非可变操作符非常有用,并且即使借用了语法,其含义也会从前/后增量中改变。

您是否了解提供此类运营商的任何语言,为什么它不常见?

3 个答案:

答案 0 :(得分:3)

对给定示例的基本反对意见是它会产生歧义:

a=-5;    //'a = -5' or 'a =- 5'?
b=*p;    //'b = *p' or 'b =* p'?
c=.5;    //'c = .5' or 'c =. 5'?

编辑但不,我不知道有任何语言使用它们。据推测,这是因为它们从C中被省略,而大多数其他语言都是从这些语言中派生出来的。

是的,我很乐意用我使用的语言看到它们。

答案 1 :(得分:2)

组合'op ='运算符是var = var op predicate的简写,但op不一定是特别的。 '.'运算符恰好是多种语言中“追加”操作的简写,但没有什么可以阻止你定义“prepend”操作 - 甚至改变追加到prepend - 用任何允许重载的语言对于您要使用的任何数据类型的操作符(或者您可能用于包含该数据的任何对象)。如果你想为textvar /= newtext提供textobj = textobj->prepend(newtext)简写,那就没有什么能阻止你了。

那就是说,你可能永远不会这样做,因为没有办法在不引起混乱的情况下改变现有的操作员。更改语句顺序变得非常容易(也更清晰),这样您就可以从左到右,或使用unshift之类的特定函数来预先添加任何模糊内容。

答案 2 :(得分:0)

我不知道,我认为不存在,因为它是元元指令。

为了解释,原始运算符(对于数字)来自C,它们直接映射到机器代码操作。这使得程序员可以进行优化,因为早期的编译器没有 所以,

x=x+1;

x+=1;

x++;

将生成三个不同的汇编程序输出。

现在,为字符串添加+ =是一个元命令。它不会映射到操作码,它只是跟随并扩展模式。