|
|
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Всем добрый день. вот такой код: Код: plaintext 1. 2. Кстати, если уж необходимо гарантированное однократное увеличение, то можно и так написать: Код: plaintext 1. 2. 3. 4. Вобщем то понятно, подобные примеры - это road to hell. Мнения ? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 09:39 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Так а вопрос то в чём? Всё правильно, всё работает. Если у кого то труднос пониманием таких конструкций пусть их не использует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:02 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
x_0040h x> Так а вопрос то в чём? Всё правильно, всё работает. Если у x> кого то труднос пониманием таких конструкций пусть их не x> используетИнтересуют мнения - соответствует такое поведения компилятора стандарту или нет. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:08 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Карабас Барабасвот такой код: Код: plaintext 1. 2. 5/4 "... behavior is undefined" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:20 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас x_0040h x> Так а вопрос то в чём? Всё правильно, всё работает. Если у x> кого то труднос пониманием таких конструкций пусть их не x> используетИнтересуют мнения - соответствует такое поведения компилятора стандарту или нет. Posted via ActualForum NNTP Server 1.3 Какой компилятор используешь? У меня все имеющиеся в распоряжении gcc в обоих случаях 6 выдали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:27 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
ZrenBy 5/4 "... behavior is undefined" Опредил =) Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified. Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined. [Example: i = v[i++]; // the behavior is undefined i = 7, i++, i++; // ‘i’ becomes 9 i = ++i + 1; // the behavior is undefined i = i + 1; // the value of ’i’ is incremented —end example] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:27 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
v6yКакой компилятор используешь?C++Builder 5.0 Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:32 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
x_0040h ZrenBy 5/4 "... behavior is undefined" Опредил =) Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified. Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined. [Example: i = v[i++]; // the behavior is undefined i = 7, i++, i++; // ‘i’ becomes 9 i = ++i + 1; // the behavior is undefined i = i + 1; // the value of ’i’ is incremented —end example] То что в зависимости от компилятора будет разный результат и ежу понятно. Но поскольку такие конструкции не запрещены, то вопрос о неком стандарте по вычислению подобных выражений имеет право быть, ИМХО. 2Карабас Барабас Скорее всего зависит от способа получения/вычисления дерева выражений того или иного компилятора. Лично мне понятен случай когда в обоих примерах получаем 6. А вот почему второй пример у тебя возвращает 5... Может x_0040h объяснит? ;-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:47 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
v6yА вот почему второй пример у тебя возвращает 5Меня это тоже озадачило :) Ассемблерный код совершенно другой генерится. кстати, вот такой код: Код: plaintext 1. 2. 3. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 10:53 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Предлагаю Вам господа выложить сюда ассемблерный код, который генерирует ваш компилятор, потому как мой при любых вариантах кода представленных здесь выдаёт 6 (MSVS 2005(восьмёрка)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 11:14 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
x_0040h x> Предлагаю Вам господа выложить сюда ассемблерный код, x> который генерирует ваш компилятор, потому как мой при x> любых вариантах кода представленных здесь выдаёт 6 (MSVS x> 2005(восьмёрка)) C++Builder 5.0: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 11:22 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасC++Builder 5.0То же, но после включения оптимизации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 11:35 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
gcc manProblems often result from expressions with two increment operators, as in f (*p++, *p++). Your previous compiler might have interpreted that expression the way you intended; GCC might interpret it another way. Neither compiler is wrong. The bug is in your code. Код: plaintext 1. 2. 3. 4. ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 13:07 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
manThe C and C++ standards have the notion of "sequence points". Everything that happens between two sequence points happens in an unspecified order, but it has to happen after the first and before the second sequence point. The end of a statement and a function call are examples for sequence points, whereas assignments and the comma between function arguments are not. http://gcc.gnu.org/bugs.html#nonbugs_c ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 13:49 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
http://publications.gbdirect.co.uk/c_book/chapter8/sequence_points.html ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 13:56 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
a=(++a)+(++a); так что стандарт говорит, что может быть всё что угодно, но на моё имхо должно быть 5 :) ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 14:02 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Результат по стандарту не определен. Компилироваться такой код обязан без ошибок. Как он будет работать стандарт не оговаривает. Это все насколько я знаю. Т.е. такое поведение компилятора полностью соответствует стандарту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 14:17 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Это, а объясните, как там 6-то может получиться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 14:24 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
MasterZivкак там 6-то может получиться ?лихко: 3+3=6 Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 14:29 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто, а объясните, как там 6-то может получиться ? ИМХО 6 там просто обязано получится. Возьмём например a=(++a)+(++a); //скобки кстати можно убрать, инкремент приоритетней. Сначала срабатывает левый инкремент "а", и "а" становится равным 2. Потом срабатывет правый инкремент и "а" становится равным 3. Потом "а" складывается с "а" 3+3=6. Мне кажется всё логично с точи зрения компилятора, если рассматривать "а" как ячейку памяти значение в которой дважы инкрементируется и складывается само с собой. В конечном итоге мы же складываем значения в памяти, а не какие то абстрактные понятия. ИМХО логика borland-овского компилятора, который сохраняет результат выполения левого инкремента во временное хранилище не верна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 15:04 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
x_0040hИМХО логика borland-овского компилятора, который сохраняет результат выполения левого инкремента во временное хранилище не вернаНичгео он не сохраняет, у меня в этом примере получилось 6. 5 получилось в других примерах: со ссылками и с присваиванием Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 15:06 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял Карабаса Барабаса, то его интересует как, по мнению форумчан, должны вычисляться подобные выражения. И если я понял его правильно, то тогда я не понял чего народ тут усиленно толкует о том что дважды два четыре (результат по стандарту не определен бла-бла-бла) Я тут по-медитировал, и тоже пришел к мнению, что Код: plaintext 1. 2. В что-то типа польской записи: (PREINCa)(PREINCa)+ PREINCa=2 PREINCa=3 2+3=5 И код генерировать соответсвующий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 15:16 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
x_0040hИМХО 6 там просто обязано получится.м-да? А если а - объект пользовательского класса с переодределёнными операторами + и ++ ? а скомпиль такую штуку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 15:17 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас x_0040hИМХО логика borland-овского компилятора, который сохраняет результат выполения левого инкремента во временное хранилище не вернаНичгео он не сохраняет, у меня в этом примере получилось 6. 5 получилось в других примерах: со ссылками и с присваиванием Posted via ActualForum NNTP Server 1.3 Видимо я вас неправильно понял. Но и код со ссылками в MSVS выдаёт 6. Лично я считаю такой резуьтат верным и ожидаемым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 15:20 |
|
||
|
Префиксные операции и стандарт
|
|||
|---|---|---|---|
|
#18+
maXmo x_0040hИМХО 6 там просто обязано получится.м-да? А если а - объект пользовательского класса с переодределёнными операторами + и ++ ? а скомпиль такую штуку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. А скомпиль такую штуку: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Наверное это всё таки пустой спор из разряда Linux vs Wndows, хотя всё таки можешь попробовать меня переубедить(если не жалко рабочего времени - читай денег работодателя), что надо возвращать экземпляр а не ссылку при перегрузке оператора инкремента. PS: кстати на собеседованиях иногда спрашивают такого рода вопросы, но форма обычно "что быдет, если вызвать f(++p,++p); и что будет если f(++p,p++);" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2006, 16:30 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=294&tid=2028877]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 386ms |

| 0 / 0 |
