А вот не надо верить глазам своим :)
От: c-smile Канада http://terrainformatica.com
Дата: 10.11.17 04:52
Оценка: 1 (1) :))) :))) :)
int a = 2;
printf("%d", ++a + ++a + ++a);


> 13


https://repl.it/OEEN/1
Re: А вот не надо верить глазам своим :)
От: ArtDenis Россия  
Дата: 10.11.17 06:04
Оценка: 2 (2) +8
Здравствуйте, c-smile, Вы писали:

CS>
>> 13
CS>


c-smile и UB: первая встреча.

PS: лучше поздно, чем никогда

Или прикол в чём-то другом?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: А вот не надо верить глазам своим :)
От: kov_serg Россия  
Дата: 10.11.17 06:39
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>
CS>int a = 2;
CS>printf("%d", ++a + ++a + ++a);
CS>

A+B
берём A => ++a : a=3
берём B => ++a : a=4
C=складываем a+a = 4 + 4 = 8
берём C+D
берём D => ++a : a=5
8+5=13
Всё правильно

CS>
>> 13
CS>


CS>https://repl.it/OEEN/1
Re: А вот не надо верить глазам своим :)
От: K13 http://akvis.com
Дата: 10.11.17 07:11
Оценка:
Здравствуйте, c-smile, Вы писали:

printf("%d", ++a + (++a + ++a));

и получаем 15
Re[2]: А вот не надо верить глазам своим :)
От: kov_serg Россия  
Дата: 10.11.17 07:29
Оценка:
Здравствуйте, K13, Вы писали:

K13>Здравствуйте, c-smile, Вы писали:


K13>
K13>printf("%d", ++a + (++a + ++a));
K13>

K13>и получаем 15

Дык тоже самое
берём первое слагаемое увеличиваем a=3
берём второе скобки
берём первое в скобках увеличиваем a=4
берём второе увеличиваем a=5
складываем a+a = 5+5 = 10
результат складываем с a
a+10=5+10=15
Re: А вот не надо верить глазам своим :)
От: AleksandrN Россия  
Дата: 10.11.17 08:39
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>
CS>int a = 2;
CS>printf("%d", ++a + ++a + ++a);
CS>


CS>
>> 13
CS>


CS>https://repl.it/OEEN/1


По выражению ++a + ++a + ++a компилятор, построит такое дерево разбора:
    +
   / \
  /   \
++a(1) ++a(2)
        \
         \
          +
           \
            \
          ++a(3)


и сгенерирует примерно такой код (x86):
inc a           ; a = 3 (1) в скобочках - порядковый номер инкремента в примере
inc a           ; a = 4 (2)
mov eax, a      ; a = 4, eax = 4 
add eax, a      ; a = 4, eax = 8
inc a           ; a = 5 (3), eax = 8
add eax, a      ; a = 5, eax = 13


Компилятор честно выполнил инкремент до сложения и складывал с результатами инкремента . Результат зависит от платформы, компилятора и от того, какие параметры оптимизации кода были указаны при компиляции. Не нужно писать в коде выражения ++a + ++a + ++a, если нет желания устраивать пляски с бубном для поиска непонятных ошибок.
Отредактировано 10.11.2017 11:32 AleksandrN . Предыдущая версия .
Re: А вот не надо верить глазам своим :)
От: MTD https://github.com/mtrempoltsev
Дата: 10.11.17 09:14
Оценка: +6
Здравствуйте, c-smile, Вы писали:

CS>https://repl.it/OEEN/1


Изменение одной переменной более одного раза не пересекая точку следования (sequence points) — UB.
Re: А вот не надо верить глазам своим :)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.11.17 21:08
Оценка:
Здравствуйте, c-smile, Вы писали:

clang всех версий от 3.8 до 5.0 выдаёт 12, но пишет:

csm1.c:5:24: warning: multiple unsequenced modifications to 'a' [-Wunsequenced]
        printf("%d\n", ++a + ++a + ++a);
                       ^     ~~


У меня был веселее пример:

extern int a,b;
void f(void) {
  a = (a++) % b;
}


при a=19, b=5 выдавало:

При входных значениях a=19, b=5 значение a в результате:
gcc3.4, gcc>=4.8, tcc, clang>=2.9, SunC++, C#: 4
gcc от 4.0 до ~4.6: 20
SunC, IntelC 10.1: 5
The God is real, unless declared integer.
Re[2]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 10.11.17 23:27
Оценка: -1
Здравствуйте, ArtDenis, Вы писали:

AD>c-smile и UB: первая встреча.

не смотря на УБ, оно сработало как и должно
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: А вот не надо верить глазам своим :)
От: Nikе Россия  
Дата: 11.11.17 01:14
Оценка:
Здравствуйте, Vain, Вы писали:

AD>>c-smile и UB: первая встреча.

V>не смотря на УБ, оно сработало как и должно
Зависит от компилятора и того что тебе нужно.
Нужно разобрать угил.
Re[2]: А вот не надо верить глазам своим :)
От: rg45 СССР  
Дата: 11.11.17 15:05
Оценка: 8 (1) +3
Здравствуйте, MTD, Вы писали:

MTD>Изменение одной переменной более одного раза не пересекая точку следования (sequence points) — UB.


Следует заметитть что, начиная с 11-го стандарта, точки следования убрали, как таковые, и ввели вместо них понятия "sequenced before" и "unsequenced". Но на результат это не повлияло, в данном случае, действительно имеем UB (поскольку вычисление операндов оператора сложения "unsequenced"):

ISO/IEC/14882-2011
1.9/15

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [ Note: In an expression that is evaluated more than once during the execution of a program, unsequenced and indeterminately sequenced evaluations of its subexpressions need not be performed consistently in different evaluations. —end note ] The value computations of the operands of an operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either anotherside effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. [ Example:

void f(int, int);
void g(int i, int* v) {
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
f(i = -1, i = -1); // the behavior is undefined
}

--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 11.11.2017 16:34 rg45 . Предыдущая версия . Еще …
Отредактировано 11.11.2017 15:10 rg45 . Предыдущая версия .
Отредактировано 11.11.2017 15:07 rg45 . Предыдущая версия .
Re[4]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 12.11.17 13:37
Оценка:
Здравствуйте, Nikе, Вы писали:

AD>>>c-smile и UB: первая встреча.

V>>не смотря на УБ, оно сработало как и должно
N>Зависит от компилятора и того что тебе нужно.
Нормальный компилятор не будет дополнительно "подсирать" логику даже несмотря на УБ.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: А вот не надо верить глазам своим :)
От: Nikе Россия  
Дата: 12.11.17 16:19
Оценка: +2 :))
Здравствуйте, Vain, Вы писали:

N>>Зависит от компилятора и того что тебе нужно.

V>Нормальный компилятор не будет дополнительно "подсирать" логику даже несмотря на УБ.

А надо бы.
Нужно разобрать угил.
Re[6]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 12.11.17 16:36
Оценка:
Здравствуйте, Nikе, Вы писали:

N>>>Зависит от компилятора и того что тебе нужно.

V>>Нормальный компилятор не будет дополнительно "подсирать" логику даже несмотря на УБ.
N>А надо бы.
Зачем? Любишь извращения?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: А вот не надо верить глазам своим :)
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 12.11.17 16:47
Оценка:
А могло и диск отформатировать.
Ce n'est que pour vous dire ce que je vous dis.
Re[2]: А вот не надо верить глазам своим :)
От: const_volatile  
Дата: 12.11.17 17:17
Оценка: :)
Здравствуйте, ArtDenis, Вы писали:

AD>c-smile и UB: первая встреча.


лишний раз показывает, чего стоит стаж на этом форуме

p.s. открыл его профиль, увидел бейджик "эксперт". ok, чо.
Re[7]: А вот не надо верить глазам своим :)
От: Nikе Россия  
Дата: 12.11.17 18:55
Оценка:
Здравствуйте, Vain, Вы писали:

N>>>>Зависит от компилятора и того что тебе нужно.

V>>>Нормальный компилятор не будет дополнительно "подсирать" логику даже несмотря на УБ.
N>>А надо бы.
V>Зачем? Любишь извращения?

Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.
Нужно разобрать угил.
Re[8]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 12.11.17 20:05
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.

Плохо учили, УБ в одном месте не в праве порождать УБ в другом.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: А вот не надо верить глазам своим :)
От: Nikе Россия  
Дата: 12.11.17 20:53
Оценка:
Здравствуйте, Vain, Вы писали:

N>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.

V>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.

Не уловил логики.
Нужно разобрать угил.
Re[10]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 12.11.17 21:36
Оценка:
Здравствуйте, Nikе, Вы писали:

N>>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.

V>>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.
N>Не уловил логики.
форматирование диска от неправильной последовательности сложения в каком-то кривом приложении это независимое УБ.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[11]: А вот не надо верить глазам своим :)
От: Mr.Delphist  
Дата: 13.11.17 16:00
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Nikе, Вы писали:


N>>>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.

V>>>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.
N>>Не уловил логики.
V>форматирование диска от неправильной последовательности сложения в каком-то кривом приложении это независимое УБ.

Оптимизатор выкидывает кусок кода, посчитав какой-то ифчик заранее предвычисляемым. Этот ифчик уберегал от вызова "format c: /y" (или что там по параметрам у него — не помню). В результате, дебажная сборка работает как надо, релизная — форматит диск независимо от телодвижений поциЭнта.
Re[12]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 13.11.17 16:29
Оценка: +1
Здравствуйте, Mr.Delphist, Вы писали:

MD>Оптимизатор выкидывает кусок кода, посчитав какой-то ифчик заранее предвычисляемым. Этот ифчик уберегал от вызова "format c: /y" (или что там по параметрам у него — не помню). В результате, дебажная сборка работает как надо, релизная — форматит диск независимо от телодвижений поциЭнта.

Глупости. В реальности будет как мининум код подтверждением намерений выстрелить себе в ногу, наподобии "повторите ввод пароля", да ещё и с задержкой.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[9]: А вот не надо верить глазам своим :)
От: Masterspline  
Дата: 13.11.17 17:20
Оценка: +2 -1 :)
N>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.
V>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.

UB в любом месте — это полный UB, глобальный и бесповоротный. Не надо недооценивать UB.
Re[10]: А вот не надо верить глазам своим :)
От: Vain Россия google.ru
Дата: 14.11.17 09:17
Оценка:
Здравствуйте, Masterspline, Вы писали:

N>>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.

V>>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.
M>UB в любом месте — это полный UB, глобальный и бесповоротный. Не надо недооценивать UB.
Нет конечно. Компилятор дложен страховать в этом месте, иначе накой он нужен?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: А вот не надо верить глазам своим :)
От: AleksandrN Россия  
Дата: 14.11.17 12:18
Оценка:
Здравствуйте, Vain, Вы писали:

V>Нормальный компилятор не будет дополнительно "подсирать" логику даже несмотря на УБ.


Подсирать не будет. Но UB на то и UB, что результат не определён и может отличаться у разных компиляторов.
На данном примере gcc даёт результат 13, а MSVC 15.
Re[2]: А вот не надо верить глазам своим :)
От: AlexGin Беларусь  
Дата: 14.11.17 20:26
Оценка:
Здравствуйте, K13, Вы писали:

K13>Здравствуйте, c-smile, Вы писали:


K13>
K13>printf("%d", ++a + (++a + ++a));
K13>

K13>и получаем 15

Всё верно — так как выполнение здесь идёт справо налево
Re[11]: А вот не надо верить глазам своим :)
От: Хреннос  
Дата: 09.01.18 07:33
Оценка:
Здравствуйте, Vain, Вы писали:

V> Компилятор дложен страховать в этом месте, иначе накой он нужен?

Это в голанге компилятор страхующий.
Компилятор С++ никому ничего не дложен, окромя следования стандарту. Он даже предупреждения выдавать не обязан (стандарт говорит, что "implementations are encouraged to issue a warning").
Re: А вот не надо верить глазам своим :)
От: Мёртвый Даун Россия  
Дата: 09.01.18 08:38
Оценка:
Здравствуйте, c-smile, Вы писали:

Немного оффтопа. Навеяло чтото.

Пора бы уже отходить от строгих канонов когда компилятор рубит пальцы. Наоборот, он должен быть моим другом и помощником. Предвидеть мои действия, исправлять их изо всех сил, даже если с утра я выпил коньяку.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: А вот не надо верить глазам своим :)
От: 0x7be СССР  
Дата: 09.01.18 09:31
Оценка: -1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Пора бы уже отходить от строгих канонов когда компилятор рубит пальцы. Наоборот, он должен быть моим другом и помощником. Предвидеть мои действия, исправлять их изо всех сил, даже если с утра я выпил коньяку.

Всё верно! Почувствовал запах алкоголя — заблокировал консоль.
Определил такой код, как ТС написал — ампутировал руки программисту, чтобы больше не писал такого.
Re: А вот не надо верить глазам своим :)
От: Bjorn Skalpe Земля  
Дата: 19.02.18 05:01
Оценка:
CS>printf("%d", ++a + ++a + ++a);

За такие извращения бить надо лопатой...
Re[9]: А вот не надо верить глазам своим :)
От: Meyers  
Дата: 20.03.18 17:36
Оценка:
N>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.
V>Плохо учили, УБ в одном месте не в праве порождать УБ в другом.

УБ в одном месте вправе "порождать УБ" даже в коде, который выполнялся до операции с УБ.
Re[8]: А вот не надо верить глазам своим :)
От: alzt  
Дата: 02.04.18 20:54
Оценка: +1
Здравствуйте, Nikе, Вы писали:

V>>Зачем? Любишь извращения?


N>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.


Почти все программы содержат UB и разработчики компиляторов об этом знают.
Re[9]: А вот не надо верить глазам своим :)
От: Nikе Россия  
Дата: 02.04.18 23:09
Оценка: -1
Здравствуйте, alzt, Вы писали:

N>>Люблю порядок. Меня учили что ЮБ имеет право тебе диск отформатировать.


A>Почти все программы содержат UB и разработчики компиляторов об этом знают.


Ну баги принципиально неискоренимы, при разработке в стиле предлагаемом императивными языками.
Нужно разобрать угил.
Re[10]: А вот не надо верить глазам своим :)
От: alzt  
Дата: 03.04.18 19:48
Оценка:
Здравствуйте, Nikе, Вы писали:

A>>Почти все программы содержат UB и разработчики компиляторов об этом знают.


N>Ну баги принципиально неискоренимы, при разработке в стиле предлагаемом императивными языками.


Да при любом стиле, люди ошибаются. К счастью разработчики компиляторов не наказывают за это специально. UB может привести к очень неприятным последствиям, даже хуже, чем форматирование диска, но никто специально вставлять какую-то гадость в этом случае не будет. И в большинстве случаев последствия будут довольно локальными.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.