|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
так как я явно задал приоритеты скобками, то ожидаю от компилятора разворачивание в вид a = (a+1) * (-1); b = (b+1) * (-1); c = (c+1) * (-1); соответственно ожидаю и ответы -2 для a, b, c. однако компилятор gcc выдает -1-2-1 а компилятор vc++ вообще выдал 0 -2 0 ----------- можете объяснить? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 08:09 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
про ПРЕ и ПОСТ я в курсе. но я явно задаю порядок. и почему разные компиляторы вычисляют по разному? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 09:09 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNose, Приоритет ни причем ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 09:12 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNose, каждый по своему прав авторПри использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1студия думает, что выражение это вся строка гнус думает, что выражение ограничено скобками ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 11:36 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Если убрать из кода пост-инкремент то появится хоть какой-то детерминизм. А без этого выражение - ребус. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 11:48 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
z = (a++)*(-1) это не то же самое что z = (a+1)*(-1), это скорее z = (a)*(-1); a += 1 возможно речь шла про z = (++a)*(-1), тут должно быть -2 Интересно что код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
зависит от комментированной строки. Я такое уже как-то встречал, например Код: plaintext 1. 2. 3. 4. 5.
Если убрать if, то результат будет другим нежели с if(0) =) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 12:49 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNoseпро ПРЕ и ПОСТ я в курсе. но я явно задаю порядок. и почему разные компиляторы вычисляют по разному? Потому что UB a++ это не a+1, это означает при следующем чтении a будет больше на 1, а где произойдет сохранение увеличенного значения в a (по закрывающей скобке или по точке с запятой) остается на усмотрение компилятора. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 13:38 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Не согласен, что это UB. Gcc прав. с = *pc++ - классика ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 13:42 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
UB это когда _один объект_ модифицируется _дважды_ в точке следования. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 13:45 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
SiemarglUB это когда _один объект_ модифицируется _дважды_ в точке следования. У него дважды "a =" и "a++" Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 13:48 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Dima T, точно, присваивание то я и не заметил ) Но это не то, что спрашивал топик, на самом деле правильный пример для его вопроса, чтобы не влияло от скобочек =) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 13:54 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Aklinz = (a++)*(-1) это не то же самое что z = (a+1)*(-1), это скорее z = (a)*(-1); a += 1 возможно речь шла про z = (++a)*(-1), тут должно быть -2 Интересно что код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
зависит от комментированной строки. Я такое уже как-то встречал, например Код: plaintext 1. 2. 3. 4. 5.
Если убрать if, то результат будет другим нежели с if(0) =) В коде выше ясно, почему зависит, //int d = (a++)*(-1); увеличивает а а в вашем примере - загадка, почему ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 16:32 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Один из поинтов почему ФП (Scala в частности) отказалась от пред- пост- инкремента. Он просто заменен на функцию сложения. (+) - это функция. Гарантии чистоты и отсуствия побочных эффектов потребовали. Код: plaintext 1.
В сях инкремент - мощная штука. В одном из жлобских ассемблеров (под PDP) кажется функции инкремента, разыменования и сравнения занимали 1 ассемблерную инструкцию. Точных ссылок я не помню. Могу ошибаться. Пускай знающие подскажут т.к. PDP это была .. не моя эпоха скажем так. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 16:53 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
maytonВ одном из жлобских ассемблеров (под PDP) кажется функции инкремента, разыменования и сравнения занимали 1 ассемблерную инструкцию. Там был автоинкрементный/декрементный способ адресации, применимый к любой операции и любому регистру. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 17:09 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Инкремент/декремент есть во многих (возможно во всех) ассемблерах. Потому что технически проще на транзисторах сделать +1 чем +N. Но в ассемблере нет пред-/пост-. ИМХО это уже синтаксический сахар в чистом виде. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 17:56 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNose Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
так как я явно задал приоритеты скобками, то ожидаю от компилятора разворачивание в вид a = (a+1) * (-1); b = (b+1) * (-1); c = (c+1) * (-1); соответственно ожидаю и ответы -2 для a, b, c. однако компилятор gcc выдает -1-2-1 а компилятор vc++ вообще выдал 0 -2 0 ----------- можете объяснить? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:05 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Вопрос немного не про то. Вот точная фраза из с++ референс в части приоритета операторов: Parts of the expressions can be enclosed in parenthesis to override this precedence order, or to make explicitly clear the intended effect. Я явно задал приоритеты скобками, компилятор съел код. Приоритет скобок ровно такой же как и у ++ независимо от пре или пост. Я вправе расчитывать управление ходом расчетов с помощью скобок, не так ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:18 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNoseЯ вправе расчитывать управление ходом расчетов с помощью скобок, не так ли? Вправе. Но ты должен пояснить почему ты ожидаешь от (a++) результат 2. Инкремент а при постфиксе происходит после получения его текущего значения и это не зависит от приоритета. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:30 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Такое выражение Код: plaintext 1.
Эквивалентно Код: plaintext 1. 2.
Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении. Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:34 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
maytonЧто должен сделать компиллятор? Нормальный компилятор (GCC) полностью вычислит всё, что справа от знака присваивания, включая побочные эффекты, перед выполнением собственно присваивания. У MS, очевидно, другое мнение. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:37 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
maytonТакое выражение Код: plaintext 1.
Эквивалентно Код: plaintext 1. 2.
Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении. Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор? компилятор должен выплюнуть ошибку. Либо таки воспользоваться приоритетом скобок. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:38 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNosemaytonТакое выражение Код: plaintext 1.
Эквивалентно Код: plaintext 1. 2.
Потому - что пост-инкремент исполняется после того как переменная поучаствовала в выражении. Но у тебя a стоит еще и слевой части присвоения (!). Вопрос. Что должен сделать компиллятор? компилятор должен выплюнуть ошибку. Либо таки воспользоваться приоритетом скобок. Причем здесь скобки? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:40 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
eNoseЛибо таки воспользоваться приоритетом скобок. У тебя в скобках операция, гарантированным результатом которой является старое значение переменной. Скобки этого не в состоянии изменить. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:40 |
|
вопрос про приоритеты операций
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovmaytonЧто должен сделать компиллятор? Нормальный компилятор (GCC) полностью вычислит всё, что справа от знака присваивания, включая побочные эффекты, перед выполнением собственно присваивания. У MS, очевидно, другое мнение. операция присваивани, такая же операция - 21809246 , весь вопрос где заканчивается выражение ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2019, 18:41 |
|
|
start [/forum/topic.php?fid=57&msg=39774024&tid=2017663]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 157ms |
0 / 0 |