【问题标题】:Combined post-operators?合并后运算符?
【发布时间】:2010-09-15 10:12:51
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: syntax language-features language-design


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        x=x+1;
        

        和

        x+=1;
        

        和

        x++;
        

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

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

        【讨论】:

          猜你喜欢
          • 2021-04-20
          • 2012-09-19
          • 2013-09-13
          • 2018-05-02
          • 2015-03-31
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          相关资源
          最近更新 更多