1

我们都熟悉前置和后置操作符,例如

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

以及扩展此原则的“组合运算符”:

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

我经常需要一个“后组合运算符”,这将允许:

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

显然,这仅对不可交换运算符真正有用,并且含义从前/后增量改变,即使语法是借用的。

您是否知道提供这种运算符的任何语言,为什么它不更常见?

4

3 回答 3

3

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

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

编辑:但是不,我不知道有任何语言使用它们。大概这是因为它们在 C 中被省略了,大多数其他语言都从那里得到了它们的基本运算符。

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

于 2008-10-05T22:54:07.820 回答
2

组合的 'op=' 运算符是 的简写var = var op predicate,但 op 不必是特别的任何东西。运算符恰好是多种语言中“追加”操作的'.'简写,但没有什么能阻止您以任何允许在任何数据类型上重载运算符的语言定义“前置”操作 - 甚至将追加更改为前置您想使用(或在您可能用来包含该数据的任何对象上)。如果你想做textvar /= newtext速记,textobj = textobj->prepend(newtext)没有什么能阻止你。

也就是说,您可能永远不应该这样做,因为没有办法在不引起大量混乱的情况下更改现有运算符。更改语句顺序要容易得多(也更清晰),这样您就可以从左到右,或者使用特定的功能,例如在unshift没有任何歧义的情况下添加内容。

于 2008-10-05T23:27:26.083 回答
0

我不知道,我认为不会有,因为它是一个元元命令。

解释一下,最初的运算符(用于数字)来自 C 语言,它们直接映射到机器代码操作。这允许程序员进行优化,因为早期的编译器没有。
所以,

x=x+1;

x+=1;

x++;

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

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

于 2008-10-05T22:58:02.540 回答