А вот не надо верить глазам своим :)
От: 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.]
[Даю очевидные ответы на риторические вопросы]
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.