5 761

Re: Тема для розмов

а те що UB компілер може відрізати, не спитавши в кодера

Подякували: ostap34PHP1

5 762

Re: Тема для розмов

Прихований текст

Ех, я ж думав що після прохання до адмінів видалити повідомлення, в моєму профілі кількість повідомлень також зменшиться, але вона така сама  :( , буду вдячний якщо зменшите кількість відповідно до видалених повідомлень на цій сторінці

5 763

Re: Тема для розмов

FakiNyan написав:

аа, я, здається, пойняв
i++ повертає 6, далі воно додається до ++i, котре повертає 5, після чого ось це останнє ++i інкрементує результат, ага?
ось туто кажуть, що ++i виконується справа наліво

http://en.cppreference.com/w/cpp/langua … precedence

Ні, ні і ні! і++ робится в самому кінці, ++і робится в першу чергу.

5 764

Re: Тема для розмов

ну нехай так

5 765 Востаннє редагувалося LoganRoss (07.08.2017 18:45:15)

Re: Тема для розмов

/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

Подякували: 0xDADA11C7, /KIT\, 221VOLT3

5 766

Re: Тема для розмов

Трохи перероблю задачку:

int i = 5;
int j = 2;
j = i++ + ++i;

Чому буде дорівнювати j та і? (С++)

Подякували: 221VOLT1

5 767

Re: Тема для розмов

давайте без цієї фігні, а то в мене голівка вже болить

5 768 Востаннє редагувалося 0x9111A (07.08.2017 19:28:54)

Re: Тема для розмов

LoganRoss написав:
/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.

5 769

Re: Тема для розмов

LoganRoss написав:
/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

Це абсурдно, як на мене

5 770 Востаннє редагувалося LoganRoss (07.08.2017 19:40:30)

Re: Тема для розмов

0x9111A написав:

А з чого це ви взяли, що першим обрахується "і++"?
А якщо в AST нода з "++і" пріорітетніша?
В будьякому випадку, це UB, "+" не є сіквенс поінтом, тобто операнди зліва і з права можуть бути обраховані в довільному порядку (на відміну від Java, наскільки мені відомо)

+ https://lurkmore.to/_/9978#mws_n9L3hTK

З таблиці пріоритетності
i++ можна записати як i = i + 1. В цьому випадку спочатку виконається присвоєння.
++і еквівалентно і += 1.
Так, це залежить від компілятора, але я не керувався компілятором, а тільки стандартом С++.
Знаю що на Linux g++ виведе 12 (щойно перевірив) і мені ця логіка здається дещо дивною, тому віддаю перевагу майкрософському компілятору.

Kizyak написав:

Це абсурдно, як на мене

Обгрунтуйте.

5 771 Востаннє редагувалося 0x9111A (07.08.2017 19:45:39)

Re: Тема для розмов

LoganRoss написав:

З таблиці пріоритетності
i++ можна записати як i = i + 1. В цьому випадку спочатку виконається присвоєння.
++і еквівалентно і += 1.
Так, це залежить від компілятора, але я не керувався компілятором, а тільки стандартом С++.
Знаю що на Linux g++ виведе 12 (щойно перевірив) і мені ця логіка здається дещо дивною, тому віддаю перевагу майкрософському компілятору.

Kizyak написав:

Це абсурдно, як на мене

Обгрунтуйте.

Ви уважно прочитали шматок стандарту що я навів?
Ще раз по простому, порядок обробки "сторін" оператора "+" недетермінований, тобто чи ліва чи права частина буде оброблятсь - недетерміновано
З цього випливає, що результат виразу недетермінований, так як він залежить від порядку, в якому будуть обраховуватись "боки" оператора "+", який, нагадаю, недетермінований

5 772

Re: Тема для розмов

Я думав що тут добре всі знають плюси, та дехто не розуміє різницю між постфіксною формою та префіксною.

5 773

Re: Тема для розмов

і цей дехто - Kizyak ?

5 774

Re: Тема для розмов

В php наприклад різниця між постінкрементом і преінкрементом в тому, що $i++ просто збільшує на 1, а ++$i збільшує і одразу може вивести.

Подякували: Kizyak, ostap34PHP2

5 775

Re: Тема для розмов

VTrim написав:

В php наприклад різниця між постінкрементом і преінкрементом в тому, що $i++ просто збільшує на 1, а ++$i збільшує і одразу може вивести.

Так, так я мав на увазі.

Подякували: 221VOLT1

5 776

Re: Тема для розмов

0x9111A написав:

Ви уважно прочитали шматок стандарту що я навів?
Ще раз по простому, порядок обробки "сторін" оператора "+" недетермінований, тобто чи ліва чи права частина буде оброблятсь - недетерміновано
З цього випливає, що результат виразу недетермінований, так як він залежить від порядку, в якому будуть обраховуватись "боки" оператора "+", який, нагадаю, недетермінований

Уважно.
У мене в голові компілятора немає, тому, як ви бачите, я детермінував що оброблятись буде ліва частина, як і в компіляторі VS, оскільки звик до нього. Те, що навели ви про порядок обробки - залежить від компілятора. Давайте не будемо сперечатися, бо і я зі свого боку правий і ви праві. Хто неправий - недетерміновано.
Знайдемо компроміс: я кажу що результат буде 13 якщо обчислювати за лоігкою компілятора VS, в іншому випадку результат недетермінований.

5 777

Re: Тема для розмов

все залежить від коду компілятора, чи там функція обробляє, для прикладу

increment(a) { ... }

чи там все на пряму inc, dec передається
дуже багато таких приколів, з простими прикладами все просто, а от коли багато дій де свої приорітети, можуть дати не правильний результат

Подякували: LoganRoss1

5 778

Re: Тема для розмов

Kizyak написав:

Так, так я мав на увазі.

А ми, по-вашому, як маємо на увазі?
В С++:
і++ - копіює значення і додає до нього одиницю, а потім присвоє.
++і - збільшує на 1 і виводить.
P.S. Як згадував пан 0x9111A: "В будьякому випадку, це UB, "+" не є сіквенс поінтом, тобто операнди зліва і з права можуть бути обраховані в довільному порядку (на відміну від Java, наскільки мені відомо)".
Так ось в PHP, Java результат теж буде 13. Поправте, якщо помиляюся. Тому віддаю перевагу компілятору VS.

5 779

Re: Тема для розмов

таке питання, чи стану я гомосексуалістом, якщо почну займатись веб-дизайном?

Подякували: Kizyak, 0xDADA11C72

5 780

Re: Тема для розмов

Якщо задаєш такі питання, то вже ним є.

Подякували: FakiNyan, 221VOLT2