Re: Тема для розмов
а те що UB компілер може відрізати, не спитавши в кодера
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Інше → Тема для розмов
Сторінки Попередня 1 … 287 288 289 290 291 … 721 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
а те що UB компілер може відрізати, не спитавши в кодера
аа, я, здається, пойняв
i++ повертає 6, далі воно додається до ++i, котре повертає 5, після чого ось це останнє ++i інкрементує результат, ага?
ось туто кажуть, що ++i виконується справа наліво
Ні, ні і ні! і++ робится в самому кінці, ++і робится в першу чергу.
Чому буде дорівнювати змінна і? (С++)
int i = 5; i = i++ + ++i;
Буде 13.
Розв'язок
i = i++ - спочатку виконається присвоєння, а потім інкремент. Отже тут і = 5 + 1 -> i = 6
Тепер i = 6 + ++i. ++i буде тепер 7, бо після попередньої операції i++ змінна і стала 6, отже ++6 = 7.
Звідси
6 + 7 = 13
P.S. Ще можна написати чому дорівнює lvalue після кожної операції. Запишу так, може хтось зрозуміє.
5 = 5 + 1 + ++5
5 = 6 + ++6
6 = 6 + 7
7 = 13
13 = 13
Трохи перероблю задачку:
int i = 5;
int j = 2;
j = i++ + ++i;
Чому буде дорівнювати j та і? (С++)
давайте без цієї фігні, а то в мене голівка вже болить
/KIT\ написав:Чому буде дорівнювати змінна і? (С++)
int i = 5; i = i++ + ++i;
Буде 13.
Розв'язок
i = i++ - спочатку виконається присвоєння, а потім інкремент. Отже тут і = 5 + 1 -> i = 6
Тепер i = 6 + ++i. ++i буде тепер 7, бо після попередньої операції i++ змінна і стала 6, отже ++6 = 7.
Звідси
6 + 7 = 13
P.S. Ще можна написати чому дорівнює lvalue після кожної операції. Запишу так, може хтось зрозуміє.
5 = 5 + 1 + ++5
5 = 6 + ++6
6 = 6 + 7
7 = 13
13 = 13
А з чого це ви взяли, що першим обрахується "і++"?
А якщо в AST нода з "++і" пріорітетніша?
В будьякому випадку, це UB, "+" не є сіквенс поінтом, тобто операнди зліва і з права можуть бути обраховані в довільному порядку (на відміну від Java, наскільки мені відомо)
+ https://lurkmore.to/_/9978#mws_n9L3hTK
++
If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.
/KIT\ написав:Чому буде дорівнювати змінна і? (С++)
int i = 5; i = i++ + ++i;
Буде 13.
Розв'язок
i = i++ - спочатку виконається присвоєння, а потім інкремент. Отже тут і = 5 + 1 -> i = 6
Тепер i = 6 + ++i. ++i буде тепер 7, бо після попередньої операції i++ змінна і стала 6, отже ++6 = 7.
Звідси
6 + 7 = 13
P.S. Ще можна написати чому дорівнює lvalue після кожної операції. Запишу так, може хтось зрозуміє.
5 = 5 + 1 + ++5
5 = 6 + ++6
6 = 6 + 7
7 = 13
13 = 13
Це абсурдно, як на мене
А з чого це ви взяли, що першим обрахується "і++"?
А якщо в AST нода з "++і" пріорітетніша?
В будьякому випадку, це UB, "+" не є сіквенс поінтом, тобто операнди зліва і з права можуть бути обраховані в довільному порядку (на відміну від Java, наскільки мені відомо)
З таблиці пріоритетності
i++ можна записати як i = i + 1. В цьому випадку спочатку виконається присвоєння.
++і еквівалентно і += 1.
Так, це залежить від компілятора, але я не керувався компілятором, а тільки стандартом С++.
Знаю що на Linux g++ виведе 12 (щойно перевірив) і мені ця логіка здається дещо дивною, тому віддаю перевагу майкрософському компілятору.
Це абсурдно, як на мене
Обгрунтуйте.
З таблиці пріоритетності
i++ можна записати як i = i + 1. В цьому випадку спочатку виконається присвоєння.
++і еквівалентно і += 1.
Так, це залежить від компілятора, але я не керувався компілятором, а тільки стандартом С++.
Знаю що на Linux g++ виведе 12 (щойно перевірив) і мені ця логіка здається дещо дивною, тому віддаю перевагу майкрософському компілятору.Kizyak написав:Це абсурдно, як на мене
Обгрунтуйте.
Ви уважно прочитали шматок стандарту що я навів?
Ще раз по простому, порядок обробки "сторін" оператора "+" недетермінований, тобто чи ліва чи права частина буде оброблятсь - недетерміновано
З цього випливає, що результат виразу недетермінований, так як він залежить від порядку, в якому будуть обраховуватись "боки" оператора "+", який, нагадаю, недетермінований
Я думав що тут добре всі знають плюси, та дехто не розуміє різницю між постфіксною формою та префіксною.
В php наприклад різниця між постінкрементом і преінкрементом в тому, що $i++ просто збільшує на 1, а ++$i збільшує і одразу може вивести.
В php наприклад різниця між постінкрементом і преінкрементом в тому, що $i++ просто збільшує на 1, а ++$i збільшує і одразу може вивести.
Так, так я мав на увазі.
Ви уважно прочитали шматок стандарту що я навів?
Ще раз по простому, порядок обробки "сторін" оператора "+" недетермінований, тобто чи ліва чи права частина буде оброблятсь - недетерміновано
З цього випливає, що результат виразу недетермінований, так як він залежить від порядку, в якому будуть обраховуватись "боки" оператора "+", який, нагадаю, недетермінований
Уважно.
У мене в голові компілятора немає, тому, як ви бачите, я детермінував що оброблятись буде ліва частина, як і в компіляторі VS, оскільки звик до нього. Те, що навели ви про порядок обробки - залежить від компілятора. Давайте не будемо сперечатися, бо і я зі свого боку правий і ви праві. Хто неправий - недетерміновано.
Знайдемо компроміс: я кажу що результат буде 13 якщо обчислювати за лоігкою компілятора VS, в іншому випадку результат недетермінований.
все залежить від коду компілятора, чи там функція обробляє, для прикладу
increment(a) { ... }
чи там все на пряму inc, dec передається
дуже багато таких приколів, з простими прикладами все просто, а от коли багато дій де свої приорітети, можуть дати не правильний результат
Так, так я мав на увазі.
А ми, по-вашому, як маємо на увазі?
В С++:
і++ - копіює значення і додає до нього одиницю, а потім присвоє.
++і - збільшує на 1 і виводить.
P.S. Як згадував пан 0x9111A: "В будьякому випадку, це UB, "+" не є сіквенс поінтом, тобто операнди зліва і з права можуть бути обраховані в довільному порядку (на відміну від Java, наскільки мені відомо)".
Так ось в PHP, Java результат теж буде 13. Поправте, якщо помиляюся. Тому віддаю перевагу компілятору VS.
таке питання, чи стану я гомосексуалістом, якщо почну займатись веб-дизайном?