|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
в с++ от перемены мест слогаемых сумма не меняется -- пример выдает две единицы. на сишарпе - меняется, такой пример выдает 0 и 1 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
они (сишарписты) почему-то, считают, что другой компилятор выдаст 0 и 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 18:11 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Формально p++ возвращает p а затем происходит ++. ИМХО правильно работает в C#. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 18:38 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Скорее всего связано с тем что в C# стековая арифметика. В первом случае сначала пушаем на стек 0, вычисляем результат функции (0) и пушаем на стек, суммируем два значения на вершине стека: 0 + 0 = 0 Во втором сначала пушаем на стек результат функции (0), потом занчение i (которое поменялось из-за ++ на 1),уммируем два значения на вершине стека: 0 + 1 = 1. ms с++ в обоих случаях берет значение непосредственно из ячейки памяти видимо, поэтому результат один и тот же. авторони (сишарписты) почему-то, считают, что другой компилятор выдаст 0 и 1 Может и выдаст, а мож и не выдаст. Это ж UB. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 18:58 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dima TФормально p++ возвращает p а затем происходит ++. ИМХО правильно работает в C#. а в си++ чтоли не правильно? функция возращает 0, но она должна выполнится до сложения, её приоритет выше. i= i + f(i); это 1 (f уже применили) + 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 19:27 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
clihlt, сенкс ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 19:29 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingizфункция возращает 0, но она должна выполнится до сложения, её приоритет выше. но никто не не запрещает получить значения других аргументов до вызова функции. Я не большой спец в С++, подожди, пусть спецы скажут почему оно именно так считается. Возможно UB, а может и регламентировано где-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 20:07 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dima TВозможно UB, а может и регламентировано где-то. UB: https://en.cppreference.com/w/cpp/language/eval_order Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 20:22 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingizDima TФормально p++ возвращает p а затем происходит ++. ИМХО правильно работает в C#. а в си++ чтоли не правильно? функция возращает 0, но она должна выполнится до сложения, её приоритет выше. i= i + f(i); это 1 (f уже применили) + 0 объяснение аннулируется. Жук доработал пример Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
получается 3 и 2. я бы ожидал 3 и 3 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 20:49 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingizполучается 3 и 2. я бы ожидал 3 и 3 5 и 100500 тоже правильные ответы потому что UB 21722924 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 20:52 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingiz, пардон 2 и 3 (а не 3 и 2) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 20:58 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dima Ttchingizполучается 3 и 2. я бы ожидал 3 и 3 5 и 100500 тоже правильные ответы потому что UB 21722924 вы слишком широко трактуете UB в плане порядка вічисления функций. диапазон дозволенных вариантов решений не так велик. UB - только порядок вычислений, который может дать всего несколько разных вариантов результата. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 21:06 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
блин, я ассоциативность за порядок вычислений понимал. Dimitry Sibiryakov, автор This is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3() is parsed as (f1() + f2()) + f3() due to left-to-right associativity of operator+, but the function call to f3 may be evaluated first, last, or between f1() or f2() at run time то есть, в любом порядке вычислятся f1, f2 и f3, а, потом, сложение результатов идет слева - направо? (f1() + f2()) + f3() ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 21:20 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingizблин, я ассоциативность за порядок вычислений понимал. Dimitry Sibiryakov, автор This is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3() is parsed as (f1() + f2()) + f3() due to left-to-right associativity of operator+, but the function call to f3 may be evaluated first, last, or between f1() or f2() at run time то есть, в любом порядке вычислятся f1, f2 и f3, а, потом, сложение результатов идет слева - направо? (f1() + f2()) + f3() если переписать выражения используя операторы то всё обьясняется. Исполнение начинается с самой внутренней функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 21:45 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
OoCcесли переписать выражения используя операторы то всё обьясняется. Исполнение начинается с самой внутренней функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Хмм.. чушь написал ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2018, 22:27 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
OoCc, Через указатели на си тоже 2 и 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
лично меня расстраивает, что теперь одним предложением нельзя объяснить, что такое ассоциативность В Болски я понимал, что написано - вызвать все функции и складывать слева направо, а теперь надо неделю разбираться ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 10:38 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dima TФормально p++ возвращает p а затем происходит ++. ИМХО правильно работает в C#. +1 Оператор ++ (справочник по C#) Оператор инкремента (++) увеличивает операнд на 1. Оператор инкремента может находиться перед своим операндом или после него: ++variable и variable++. Примечания Первый случай — это операция префиксного инкремента. Результатом операции является значение операнда после его увеличения. Второй случай — это операция постфиксного инкремента. Результатом операции является значение операнда до его увеличения . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 12:01 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingizлично меня расстраивает, что теперь одним предложением нельзя объяснить, Можно. Просто не нужно ассоциативности ждать там, где используются функции с побочным эффектом. Которые по определению и функциями то не являются. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2018, 12:21 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Тут UB же ... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 21:33 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
tchingiz, https://en.cppreference.com/w/cpp/language/ub https://en.cppreference.com/w/cpp/language/eval_order ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 21:49 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Кэп, тебе не надоело повторять чужие посты двухдневной давности?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.11.2018, 22:00 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
похоже дошло, что такое ассоциативность. авторthis is not to be confused with left-to-right and right-to-left associativity of operators: the expression f1() + f2() + f3() is parsed as (f1() + f2()) + f3() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
i + f(&i) вычисляет 1, к которой прибавляет единица от второго вызова f(&i); f(&i) + f(&i) вычисляет 1, к которой прибавляется двойка от i после двух вызовов f и никакого UB другой компилятор cpp вычислит то же самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 12:19 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
А теперь прочитай-таки следующую строчку. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 13:57 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА теперь прочитай-таки следующую строчку. слушаюсь авторbut the function call to f3 may be evaluated first, last, or between f1() or f2() at run time. ты намекаешь, что Код: plaintext 1.
может таки вернуть 2, а не 1? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 14:04 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
Dima TФормально p++ возвращает p а затем происходит ++. ИМХО правильно работает в C#. не может в MS работать правильно, т.к. она берёт мировые стандарты и переиначивает на свой лад аля "а давайте сделаем тоже самое, но по-своему" ну и поскольку это армия индусов MS, то результат немного предсказуем - получаем перекошенный новый стандарт т.о. она никак не может сделать что-то лучше из того, что уже вылизано и стандартизировано. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 14:04 |
|
выполнить пример с инкрементом не на компиляторе MS ++
|
|||
---|---|---|---|
#18+
это попользовать? чтобы увидеть другой результат? автор/Gd использовать соглашение о вызовах __cdecl /Gr использовать соглашение о вызовах __fastcall /Gz использовать соглашение о вызовах __stdcall ... |
|||
:
Нравится:
Не нравится:
|
|||
05.11.2018, 14:07 |
|
|
start [/forum/topic.php?fid=57&msg=39727526&tid=2017157]: |
0ms |
get settings: |
8ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
36ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
449ms |
get tp. blocked users: |
1ms |
others: | 392ms |
total: | 897ms |
0 / 0 |