Re[10]: Вопрос про пре/пост инкременты
От: Erop Россия  
Дата: 19.11.10 03:25
Оценка: 1 (1) +1
Здравствуйте, Masterkent, Вы писали:

R>>Не вижу ссылки на "хорошую".

M>Хороших статей по данному вопросу не знаю.

IMHO, ты можешь попробовать её написать, раз уж всё так нереально запущено в этом деле
Тут же не только форум, но и вики и журнал есть

M>Сомнительна польза от прочтения статей, где авторы описывают своё смутное понимание некоего предмета. IMO, чтобы писать статьи, надо обладать определённым багажом знаний, а не одними благими намерениями поучить других.

Ну они хотя бы как-то пытаются помочь, а от "просто критики" ещё меньше пользы тем, кто не разобрался ещё с точками следования...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Вопрос про пре/пост инкременты
От: _lamer Беларусь  
Дата: 19.11.10 07:17
Оценка:
Здравствуйте, XJess, Вы писали:
XJ>int i = 10;
XJ>++i++;
XJ>error C2105: '++' needs l-value
XJ>Вопрос в том, ПОЧЕМУ?

А ЧЕГО СОБСТВЕННО ВЫ ХОТЕЛИ ОТ ЭТОГО КОДА?
моё мнение: и правильно сделал компилятор что ругнулся,
да есть инкременты, но использовать их надо с умом, например:
int nI=0;
myFunc (++nI, nI--){
...
}
// или
while ( --nI ) {
...
} // или ...

то здесь у меня вопросов нет, и у компилятора надеюсь тоже,
а если мне надо увелитчить целое на 2, то я пишу
int nI=0;
nI += 2;
// или
nI = nI + 2;
// ну а если условие только с использованием инкрементов
nI++;
nI++;
//я бы даже не написал
(++nI)++;
//т.к. со скобками и в скобках все понятно, а вот код
()++;
// через некоторе время или другим компилятором может "дать течь"

и заметте не парюсь по пустякам.
ЗАЧЕМ САМИМ СЕБЕ СОЗДАВАТЬ ПРОБЛЕМЫ?
компиляторы как и стандарты пишут люди, ОБЫЧНЫЕ люди, и стандарты (как и компиляторы) со временем изменяются.
Я за стабильно работающий код всегда.
в каждом проекте всегда есть над чем поработать, более серьезное и существенное.....
Re[2]: Вопрос про пре/пост инкременты
От: jazzer Россия Skype: enerjazzer
Дата: 19.11.10 08:39
Оценка: 1 (1) +1 :)
Здравствуйте, _lamer, Вы писали:

_>myFunc (++nI, nI--){

_>то здесь у меня вопросов нет, и у компилятора надеюсь тоже,
блажен кто верует
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[11]: Вопрос про пре/пост инкременты
От: Masterkent  
Дата: 19.11.10 12:42
Оценка: +2
Erop:

M>>Хороших статей по данному вопросу не знаю.


E>IMHO, ты можешь попробовать её написать, раз уж всё так нереально запущено в этом деле


А есть ли смысл? Концепция упорядочивания вычислений в C++0x более совершенна как плане интуитивной понятности, так и в плане отсутствия некоторых явно ненужных ограничений. В частности,

int i = 0;
(++i)++;

это вполне well-defined код в рамках C++0x.

1.9 Program execution — p. 15:

The value computations of the operands of an operator are sequenced before the value computation of the result of the operator.

5.3 Unary expressions -> 5.3.2 Increment and decrement:

If x is not of type bool, the expression ++x is equivalent to x+=1

5.17 Assignment and compound assignment operators:

In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.

5.2 Postfix expressions -> 5.2.6 Increment and decrement:

The value computation of the ++ expression is sequenced before the modification of the operand object.

Согласно этим правилам, порядок вычислений должен быть следующим:

1) вычисление значения операнда префиксного ++,
2) модификация объекта, осуществляемая префиксным ++,
3) вычисление значения результата префиксного ++ — оно же вычисление значения операнда постфиксного ++,
4) вычисление значения результата постфиксного ++,
5) модификация объекта, осуществляемая постфиксным ++.

Под

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined

данная последовательность вычислений, очевидно, не подпадает.

Такой код

(n *= 10) += decimal_digit; // n и decimal_digit обозначают скалярные объекты

C++03 совершенно необоснованно определяет как влекущий undefined behavior (по сути это не более чем издержки не вполне рационального обобщения в правилах).


На данный момент мне гораздо интереснее изучать C++0x и сообщать о найденных ошибках и недочётах комитету по стандартизации C++, чем работать над мало кому нужной подробной статьёй по каким-то точкам следования.

M>>Сомнительна польза от прочтения статей, где авторы описывают своё смутное понимание некоего предмета. IMO, чтобы писать статьи, надо обладать определённым багажом знаний, а не одними благими намерениями поучить других.

E>Ну они хотя бы как-то пытаются помочь

Пытаясь "как-то" помочь, можно ненароком оказать медвежью услугу. Я такое уже не раз наблюдал.

E>а от "просто критики" ещё меньше пользы тем, кто не разобрался ещё с точками следования...


А это уже не тебе решать. Я тоже далеко не во всех областях разбираюсь, и если при изучении чего-то некто будет помогать мне фильтровать вот такие писульки, я буду только рад. Я заинтересован в получении только достоверной и не сбивающей с толку информации.
Re[17]: Вопрос про пре/пост инкременты
От: XJess  
Дата: 19.11.10 14:46
Оценка:
Здравствуйте, blackhearted, Вы писали:

V>>int i = 0;

V>>(++i)++;
V>>[/ccode]

B>ИМХО, тоже не всегда неопределено. Но так как не извесно окружение этого кода сказать точно нельзя.

B>В реальности компилятор имеет в момент разбора этой конструкции вю необходимую информацию и должен вести себя в соответствии со стандартом.

Вы можете мне такой темной привести пример, как окружение может вызвать неоднозначность в этом коде? Я этого решительно пока не знаю.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.