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++;

3 つの異なるアセンブラー出力を生成します。

現在、文字列に += を追加することはメタコマンドです。オペコードにはマップされず、パターンに従って拡張されます。

于 2008-10-05T22:58:02.540 に答える