Вход | Регистрация
    1  2   
О жизни... :: Математика и алгоритмы

OFF: У кого сколько получится: int i = 5; i = ++i + ++i;

↓ [Asmody, 04.08.19 - 21:23]
OFF: У кого сколько получится: int i = 5; i = ++i + ++i;
Я
   ambrozii-fadeevich-s
 
02.08.19 - 13:48
3. 1444% (7)
2. 1331% (5)
6. Другое19% (3)
5. 166% (1)
1. 120% (0)
4. 150% (0)
Всего мнений: 16

Смотрю - пошла мода на нестандартные вычисления. У кого сколько получится: int i = 5; i = ++i + ++i;
 
 
   ambrozii-fadeevich-s
 
1 - 02.08.19 - 13:49
Пятница же!

3. 14
   Aleksey
 
2 - 02.08.19 - 13:49
на каком языке?
   ДенисЧ
 
3 - 02.08.19 - 13:49
Это UB. И однозначного результата тут нет
   ДенисЧ
 
4 - 02.08.19 - 13:49
(2) На 1с
   Ёпрст
 
5 - 02.08.19 - 13:53
а не 13 разве ? 6+7

2. 13
   NorthWind
 
6 - 02.08.19 - 13:53
я так понимаю, сначала отработают два инкремента, т.е. выйдет 6 + 7, итого 13.
   Фрэнки
 
7 - 02.08.19 - 13:53
13

2. 13
   NorthWind
 
8 - 02.08.19 - 13:55
А вот и нет. C++Builder возвращает 14.
   ambrozii-fadeevich-s
 
9 - 02.08.19 - 13:55
Эх. Непуганые все, как я посмотрю.
Ну на плюсах с учетом приоритета операций.
   ambrozii-fadeevich-s
 
10 - 02.08.19 - 13:56
(8) билдер, как и микрософтстудия, вроде, учитывает приоритет.
   Фрэнки
 
11 - 02.08.19 - 13:57
но может оказаться, что декларативное присвоение сделает эту переменную константой по дефолту. И тогда каждый раз будет инкремент для 5 и равно 12.

в Си билдер когда-то было можно определять.

А если задать для инкремента свою операцию, переопределить?
   Фрэнки
 
12 - 02.08.19 - 13:58
(9) ты задавал изначальные условия полностью, от которых может зависеть получение результата, а потом разбрасывался эпитетами
   1Сергей
 
13 - 02.08.19 - 14:01
проверил в компиляторе

3. 14
   Xapac
 
14 - 02.08.19 - 14:01
(8)

2. 13
   ambrozii-fadeevich-s
 
15 - 02.08.19 - 14:02
(12) дык - разные компиляторы выдают разное. я же не 42 хотел получить, а у кого сколько отладка покажет.
   1Сергей
 
16 - 02.08.19 - 14:02
можете проверить здесь: https://www.onlinegdb.com/online_c++_compiler
   Ёпрст
 
17 - 02.08.19 - 14:03
На питоне, так вообще 10

i=5
i=++i+ ++i
print(i)
   banco
 
18 - 02.08.19 - 14:03
Помню, в институте когда учил c++ и читал книгу Бьерна Страуструпа, там было написано что однозначного результата нет, как компилятор посчитает.

6. Другое
   1Сергей
 
19 - 02.08.19 - 14:04
(18) вывод? кресты - плохой язык?
   NorthWind
 
20 - 02.08.19 - 14:04
если честно, не очень понятно каким образом может получиться 14
   Xapac
 
21 - 02.08.19 - 14:04
(14)Проверил C# в студии 2019
   Xapac
 
22 - 02.08.19 - 14:05
(20)7+7 = 14
   ambrozii-fadeevich-s
 
23 - 02.08.19 - 14:05
(16) Hello World 14                                                                                                                                
                                                                                                                                              
...Program finished with exit code 0                                                                                                          
Press ENTER to exit console
   Windyhead
 
24 - 02.08.19 - 14:06
(0) Пока разные компиляторы выдают разные значения, 1С не врет:
"Ожидается выражение    i = 5; i = +<<?>>+i + ++i; (Проверка: Тонкий клиент)"

6. Другое
   Xapac
 
25 - 02.08.19 - 14:06
(19)Нет автор компилятора рукожоп
   NorthWind
 
26 - 02.08.19 - 14:07
Хмм... кажется, я понял за счет чего это происходит. Дело в том что инкремент записывается в одну и ту же ячейку памяти, и в результате к тому моменту когда надо сложить два слагаемых, складывается в реальности уже 7 и 7, а не 7 и 6.
   Фрэнки
 
27 - 02.08.19 - 14:07
(20) разбивает строчку действий в стэк, а при этом приоритетом сразу действия инкремента над одной и той же переменной. Будет из 5 в 6, затем 6 в 7 и затем 7+7=14
   ambrozii-fadeevich-s
 
28 - 02.08.19 - 14:07
(20) пре-инкремент возвращает значение в переменную i после выполнения, там образом следующее ++i получает уже 6 на входе и 7 на выходе. потом срабатывает 7 + 7
   NorthWind
 
29 - 02.08.19 - 14:08
Да, я уже допер, см (26)
   Windyhead
 
30 - 02.08.19 - 14:08
(19) С++ недоязык , а все кто пишут на нем не совсем программисты ;))
 
 Рекламное место пустует
   1Сергей
 
31 - 02.08.19 - 14:10
(30) :)
зачёт
   Xapac
 
32 - 02.08.19 - 14:10
(30)Это грубо Если к 1сникам так относятся, то не стоит уподобляться свинству. будем выше этого.
   Фрэнки
 
33 - 02.08.19 - 14:10
фигня в том, что ++i; пишется как отдельная операция.
Поэтому по разным определениям при раскрытии в стека может быть разная очередь выполнения операций.
   NorthWind
 
34 - 02.08.19 - 14:11
не знаю. Мне нравится. Очень забавный казус. Учит думать.
   1Сергей
 
35 - 02.08.19 - 14:11
(28) прединкремент и сложение имеют одинаковый приоритет

https://ru.cppreference.com/w/cpp/language/operator_precedence
   bolobol
 
36 - 02.08.19 - 14:13
(30) Свеж0!
   ambrozii-fadeevich-s
 
37 - 02.08.19 - 14:16
(35) С чего-бы это вдруг? Там же в таблице прямо буквами написано.
   NorthWind
 
38 - 02.08.19 - 14:19
(35) да не. У прединкремента и постинкремента 2, почти самый высокий. А у сложения 6.
   ambrozii-fadeevich-s
 
39 - 02.08.19 - 14:20
(30) Правильно. Надо писать на чистом С.
   1Сергей
 
40 - 02.08.19 - 14:23
(38) а, точно
   NorthWind
 
41 - 02.08.19 - 14:25
так что в общем-то тут никакого UB нет, все достаточно логично. Хотя само выражение больше из области курьезов чем из реального программирования. Я бы так не написал, точно :)
   Windyhead
 
42 - 02.08.19 - 14:26
(32) Я просто когда то эволюционировал из с++ в 1С , поэтому могу себе позволить ))
(39) мы тут этим и занимаемся, даже математика на нашей стороне С = 1С
   patapum
 
43 - 02.08.19 - 14:28
вариант с числом пи мне нравится

3. 14
   y88
 
44 - 02.08.19 - 14:36
(27) тогда почему 22?
i = ++i + ++i + ++i;

3. 14
   ДенисЧ
 
45 - 02.08.19 - 14:37
(41) Это UB. И это описано в докуметации.
   bolobol
 
46 - 02.08.19 - 14:45
(44) i = ++i + ++i - в данной записи очевидно присутствие 2-х пред-инкрементов, для оставшейся операции сложения - необходимо оба выполнить, т.е. ++(++5)=7 >> 7+7 = 14.
i = ++i + ++i + ++i - с первыми двумя мы разобрались >> 7 + 7 + ++i(где i= 7) >> 14 + ++7 = 14 + 8 = 22
   y88
 
47 - 02.08.19 - 14:48
(46) похоже так. Олипиадная задачка
   Йохохо
 
48 - 02.08.19 - 15:00
(46) только вот "++(++5)=7 >> 7+7 = 14" это лишнее чтение, т.к. результат первой операции уже известен. и вообще боян и (45)
   bolobol
 
49 - 02.08.19 - 15:01
(48) По запросу "UB" - яндекс выдаёт: ГИБДД - официальный сайт. Вы на что намекаете??
   trad
 
50 - 02.08.19 - 15:04
(44)
inc(i)inc(i)+inc(i)+
6
7
14
8
22
   ДенисЧ
 
51 - 02.08.19 - 15:06
   DionisSergeevich
 
52 - 02.08.19 - 15:06
Intellij idea выдает 13
   1Сергей
 
53 - 02.08.19 - 15:07
(49) Undefined Behaviour
   Йохохо
 
54 - 02.08.19 - 15:12
предиктед
   Конструктор1С
 
55 - 02.08.19 - 15:20
double a = 1000000.0;
double b = 0.01;

for (int i=1; i<=100; i++)
     a = a + b;

System.out.println("a = " + a);

сколько думаете будет?
   bolobol
 
56 - 02.08.19 - 15:30
(55) Слышал, что будет 42, долго считать тут
   DionisSergeevich
 
57 - 02.08.19 - 15:33
(55) ну логично же что 1000001.0
   trad
 
58 - 02.08.19 - 15:38
   mikecool
 
59 - 02.08.19 - 15:44
вот из-за такого мозголомства и надо расписывать операции по строкам
   Конструктор1С
 
60 - 02.08.19 - 15:47
(57) не-а

a = 1000001.0000000009

это распространенная багофича с числами с плавающей запятой
   DionisSergeevich
 
61 - 02.08.19 - 15:49
(60) а эта багофича с точки зрения логики как то объяснена?
   bolobol
 
62 - 02.08.19 - 15:54
(61) Свободный ради-кал?
   Конструктор1С
 
63 - 02.08.19 - 15:55
(61) х.з. Ну типа особенности работы с такими числами
   Провинциальный 1сник
 
64 - 02.08.19 - 15:57
(19) Подавляющее большинство багов и уязвимостей в софте - именно тяжкое наследие языка Си. Писали бы на паскале - всё было бы стабильнее на порядок.
   Fish
 
65 - 02.08.19 - 15:58
(64) А если бы на 1С, то стабильнее на 10 порядков :)
   Конструктор1С
 
66 - 02.08.19 - 16:03
double a1 = 1000000.0;
double a2 = 100000.0;
double b = 0.01;

for (int i=1; i<=100; i++) {
    a1 = a1 + b;
    a2 = a2 + b;
}

System.out.println("a1 = " + a1);
System.out.println("a2 = " + a2);
_________________________________________

a1 = 1000001.0000000009
a2 = 100000.99999999948

вот такие пироги
 
 Рекламное место пустует
   bolobol
 
67 - 02.08.19 - 16:11
(64) И тормознее на порядок порядков. Это не наследие Си - это сопроцессор математический
   Провинциальный 1сник
 
68 - 02.08.19 - 16:15
(67) Не преувеличивайте. Софт, написанный на паскале (тот же QIP к примеру) не тормознее сишного. Си - это переносимый ассемблер, для написания ядер и драйверов. То, что его начали использовать не по назначению, огромная ошибка отрасли, которая аукается до сих пор..
   Глок 17
 
69 - 02.08.19 - 16:15
(0) В уме считал по человеческой логике, получилось 13.
Проверил на компе, тоже получилось 13

2. 13
   bolobol
 
70 - 02.08.19 - 16:18
(68) Я писал программы и на том и на том - разница достигала х100 в производительности
   Провинциальный 1сник
 
71 - 02.08.19 - 16:19
(70) А на ассемблере еще быстрее будет, если правильно написать.. это не аргумент. Всё зависит от конкретного компилятора и от примененного алгоритма.
   bolobol
 
72 - 02.08.19 - 16:23
(71) А, ну если "не аргумент" и "от алгоритма"... тогда - "Ваша точка зрения ясна..." и бла-бла-бла- все дела
   Глок 17
 
73 - 02.08.19 - 16:25
(71) Писал на ассемблере преобразователь частоты в 2/3 раза. Для считывания показаний датчика оборотов с мотора для передачи в тахометр при замене двигателя с 4х цилиндров на 6 цилиндров. Программа заняла 10 байтов, один цикл рассчетов выполнялся за 3 такта. Попробуй на паскале написать, сколько тактов займет
   Кирпич
 
74 - 02.08.19 - 16:27
(70) между разными компиляторами Си тоже может быть разница х100
   Глок 17
 
75 - 02.08.19 - 16:31
У кого получается не 13, вы как считали? Что за бредятина
   bolobol
 
76 - 02.08.19 - 16:33
(75) "Всё не читал, но осуждаю"?
   Глок 17
 
77 - 02.08.19 - 16:34
(76) По шагам расписываю:

i = ++i + ++i;

1. Считаем первое слагаемое: ++i = ++5 = 6. 6 записывается в i

2. Считаем второе слагаемое: ++i = ++6 = 7

3. Складываем оба слагаемых: 6 + 7 = 13

Куда проще?
   Глок 17
 
78 - 02.08.19 - 16:40
(26) >>  Дело в том что инкремент записывается в одну и ту же ячейку памяти

Это ошибка. Результат двух выражений не должен записываться в одну и ту же ячейку памяти. Если бы компилятор так работал, то это был бы дичайший баг.
   bolobol
 
79 - 02.08.19 - 16:42
(77) То есть, всё-таки, "чукча не читатель"... в (46) и в (50) двумя вариантами описано явление 14-ти в ответ.
   DionisSergeevich
 
80 - 02.08.19 - 16:44
(77) я думаю что тут дело в IDE - некоторые, вычисоив первое а++ запомнили значение, а не указатель, другие наоборот
   Глок 17
 
81 - 02.08.19 - 16:45
(79) Так это ты чукча не читатель. Я же разжевал все подробно в (77). А в (46) вообще какой-то бред написан.
   DionisSergeevich
 
82 - 02.08.19 - 16:46
В итоге в случае с заполненным значением 6 + 7, а с заполненной ссылкой а + а
   Глок 17
 
83 - 02.08.19 - 16:46
(80) Не важно что ты запомнишь, указатель или значение. Сам подумай. Выполнилось выражение, его значение записалось в новую ячейку памяти. Выполнили то же самое выражение. С какого перепугу мы будем записывать новый результат в уже занятую ячейку, а не в новую?
   DionisSergeevich
 
84 - 02.08.19 - 16:47
*запомненной
   Глок 17
 
85 - 02.08.19 - 16:47
(82) Ссылки должно получиться две разных
   Глок 17
 
86 - 02.08.19 - 16:48
++ это оператор, которые не только увеличивает значение переменной, но и ВОЗВРАЩАЕТ результат инкремента. Мы складываем не значения переменной i, а результаты, которые вернули два разных оператора инкремента.
   DionisSergeevich
 
87 - 02.08.19 - 16:48
(83) дело в том что инкремент присваивает результат переменной, поэтому в указателе значение 7, а + а даст 14. А в случае работы со значениями - результат первого инкремента будет запомнен до второго инкремента
   Глок 17
 
88 - 02.08.19 - 16:49
(87) Я заранее ответил на это чуть выше
   Глок 17
 
89 - 02.08.19 - 16:50
(87) в указателе на i згачение 7. а в указателе на предыдущий результат выполнения значение 6
   Глок 17
 
90 - 02.08.19 - 16:52
У (++i) и у (i) должны быть разные указатели. Иначе будет неправильный результат в виде 14.
   Глок 17
 
91 - 02.08.19 - 16:53
Но по правилам хорошего программирования писать как в (0) конечно же запрещено на любом яп.
   Nyoko
 
92 - 02.08.19 - 16:56
6+8=14

3. 14
   Конструктор1С
 
93 - 02.08.19 - 17:34
(92) а почему 8?
   Глок 17
 
94 - 02.08.19 - 18:02
10 + 6 = 16

5. 16
   v77
 
95 - 02.08.19 - 18:31
(86) "++ это оператор, которые не только увеличивает значение переменной, но и ВОЗВРАЩАЕТ результат инкремента."
Это с сегодняшнего дня? Надо запомнить.
   Глок 17
 
96 - 02.08.19 - 18:36
(95) Лучше запомни если не можешь понять
   Глок 17
 
97 - 02.08.19 - 18:40
The increment and decrement operators will add one (+1) or subtract one (-1), respectively, to their operand, and then return a value.
   v77
 
98 - 02.08.19 - 18:41
(96) Ну я как бы понимаю, что 14 получится. Вот ты не можешь понять и выдумываешь какие то новые правила и отрицаешь реальность.

3. 14
   Глок 17
 
99 - 02.08.19 - 18:43
(98) Но ты не правильно понимаешь, поэтому не хочешь принять правила, и выдумываешь свои
   v77
 
100 - 02.08.19 - 18:44
(97) но создатели компиляторов Си делают по своему. от бунтари :)
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.