2008-10-05 1 views
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 

Очевидно, что это действительно полезно только для некоммутируемых операторов, и значение изменяется от pre-/post-increment, даже если синтаксис заимствован.

Вы знаете какой-либо язык, предлагающий такого оператора, и почему он не является более распространенным?

ответ

2

Основное возражение к примеру, как дарованное является то, что бы создать двусмысленность:

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

Edit: Но нет, я не знаю ни языков, которые их используют. Предположительно, это происходит потому, что они были опущены из C, откуда большинство других языков получают свои основные операторы.

И да, я хотел бы увидеть их на языках, которые я использую.

0

Нет, о котором я знаю, и я не думаю, что это будет, так как это мета-мета-команда.

Чтобы объяснить, исходные операторы (для чисел) пришли из C, где они непосредственно сопоставлены с машинным кодом. Это позволило программисту сделать оптимизацию, поскольку ранний компилятор этого не сделал.
Так,

x=x+1; 

и

x+=1; 

и

x++; 

будет генерировать три различных выходов ассемблера.

Теперь добавление + = для строки является мета-командой. Он не отображается на код операции, он просто следует и расширяет шаблон.

2

Комбинированные операторы «op =» являются сокращением для var = var op predicate, но op не должно быть ничем в частности. Оператор '.' является сокращением для операции «добавления» на нескольких языках, но нет ничего, что помешало бы вам определить операцию «preend» - или даже изменить append to prepend - на любом языке, который позволяет перегружать оператора любыми данными типа, с которым вы хотите работать (или на любом объекте, который вы могли бы использовать, чтобы содержать эти данные в противном случае). Если вы хотите сделать textvar /= newtext стенографию для textobj = textobj->prepend(newtext), вам ничего не стоит.

Это означает, что вы, вероятно, никогда не сможете этого сделать, так как нет никакого способа изменить существующего оператора, не вызывая путаницы. Намного проще (и яснее) изменить ваш заказ, чтобы вы могли идти слева направо или использовать определенную функцию, такую ​​как unshift, чтобы предлагать вещи без какой-либо двусмысленности.

Смежные вопросы