|
OFF: У кого сколько получится: int i = 5; i = ++i + ++i; 🠗 (Asmody 04.08.2019 21:23) | ☑ | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0
ambrozii-fadeevich-s
02.08.19
✎
13:48
|
Смотрю - пошла мода на нестандартные вычисления. У кого сколько получится: int i = 5; i = ++i + ++i;
|
|||||||||||||||||||
1
ambrozii-fadeevich-s
02.08.19
✎
13:49
|
Пятница же!
14 |
|||||||||||||||||||
2
Aleksey
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
13 |
|||||||||||||||||||
6
NorthWind
02.08.19
✎
13:53
|
я так понимаю, сначала отработают два инкремента, т.е. выйдет 6 + 7, итого 13.
|
|||||||||||||||||||
7
Фрэнки
02.08.19
✎
13:53
|
13
13 |
|||||||||||||||||||
8
NorthWind
02.08.19
✎
13:55
|
А вот и нет. C++Builder возвращает 14.
|
|||||||||||||||||||
9
ambrozii-fadeevich-s
02.08.19
✎
13:55
|
Эх. Непуганые все, как я посмотрю.
Ну на плюсах с учетом приоритета операций. |
|||||||||||||||||||
10
ambrozii-fadeevich-s
02.08.19
✎
13:56
|
(8) билдер, как и микрософтстудия, вроде, учитывает приоритет.
|
|||||||||||||||||||
11
Фрэнки
02.08.19
✎
13:57
|
но может оказаться, что декларативное присвоение сделает эту переменную константой по дефолту. И тогда каждый раз будет инкремент для 5 и равно 12.
в Си билдер когда-то было можно определять. А если задать для инкремента свою операцию, переопределить? |
|||||||||||||||||||
12
Фрэнки
02.08.19
✎
13:58
|
(9) ты задавал изначальные условия полностью, от которых может зависеть получение результата, а потом разбрасывался эпитетами
|
|||||||||||||||||||
13
1Сергей
02.08.19
✎
14:01
|
проверил в компиляторе
14 |
|||||||||||||||||||
14
Xapac
02.08.19
✎
14:01
|
(8)
13 |
|||||||||||||||||||
15
ambrozii-fadeevich-s
02.08.19
✎
14:02
|
(12) дык - разные компиляторы выдают разное. я же не 42 хотел получить, а у кого сколько отладка покажет.
|
|||||||||||||||||||
16
1Сергей
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) |
|||||||||||||||||||
18
banco
02.08.19
✎
14:03
|
Помню, в институте когда учил c++ и читал книгу Бьерна Страуструпа, там было написано что однозначного результата нет, как компилятор посчитает.
Другое |
|||||||||||||||||||
19
1Сергей
02.08.19
✎
14:04
|
(18) вывод? кресты - плохой язык?
|
|||||||||||||||||||
20
NorthWind
02.08.19
✎
14:04
|
если честно, не очень понятно каким образом может получиться 14
|
|||||||||||||||||||
21
Xapac
02.08.19
✎
14:04
|
(14)Проверил C# в студии 2019
|
|||||||||||||||||||
22
Xapac
02.08.19
✎
14:05
|
(20)7+7 = 14
|
|||||||||||||||||||
23
ambrozii-fadeevich-s
02.08.19
✎
14:05
|
(16) Hello World 14
...Program finished with exit code 0 Press ENTER to exit console |
|||||||||||||||||||
24
Windyhead
02.08.19
✎
14:06
|
(0) Пока разные компиляторы выдают разные значения, 1С не врет:
"Ожидается выражение i = 5; i = +<<?>>+i + ++i; (Проверка: Тонкий клиент)" Другое |
|||||||||||||||||||
25
Xapac
02.08.19
✎
14:06
|
(19)Нет автор компилятора рукожоп
|
|||||||||||||||||||
26
NorthWind
02.08.19
✎
14:07
|
Хмм... кажется, я понял за счет чего это происходит. Дело в том что инкремент записывается в одну и ту же ячейку памяти, и в результате к тому моменту когда надо сложить два слагаемых, складывается в реальности уже 7 и 7, а не 7 и 6.
|
|||||||||||||||||||
27
Фрэнки
02.08.19
✎
14:07
|
(20) разбивает строчку действий в стэк, а при этом приоритетом сразу действия инкремента над одной и той же переменной. Будет из 5 в 6, затем 6 в 7 и затем 7+7=14
|
|||||||||||||||||||
28
ambrozii-fadeevich-s
02.08.19
✎
14:07
|
(20) пре-инкремент возвращает значение в переменную i после выполнения, там образом следующее ++i получает уже 6 на входе и 7 на выходе. потом срабатывает 7 + 7
|
|||||||||||||||||||
29
NorthWind
02.08.19
✎
14:08
|
Да, я уже допер, см (26)
|
|||||||||||||||||||
30
Windyhead
02.08.19
✎
14:08
|
(19) С++ недоязык , а все кто пишут на нем не совсем программисты ;))
|
|||||||||||||||||||
31
1Сергей
02.08.19
✎
14:10
|
(30) :)
зачёт |
|||||||||||||||||||
32
Xapac
02.08.19
✎
14:10
|
(30)Это грубо Если к 1сникам так относятся, то не стоит уподобляться свинству. будем выше этого.
|
|||||||||||||||||||
33
Фрэнки
02.08.19
✎
14:10
|
фигня в том, что ++i; пишется как отдельная операция.
Поэтому по разным определениям при раскрытии в стека может быть разная очередь выполнения операций. |
|||||||||||||||||||
34
NorthWind
02.08.19
✎
14:11
|
не знаю. Мне нравится. Очень забавный казус. Учит думать.
|
|||||||||||||||||||
35
1Сергей
02.08.19
✎
14:11
|
(28) прединкремент и сложение имеют одинаковый приоритет
https://ru.cppreference.com/w/cpp/language/operator_precedence |
|||||||||||||||||||
36
bolobol
02.08.19
✎
14:13
|
(30) Свеж0!
|
|||||||||||||||||||
37
ambrozii-fadeevich-s
02.08.19
✎
14:16
|
(35) С чего-бы это вдруг? Там же в таблице прямо буквами написано.
|
|||||||||||||||||||
38
NorthWind
02.08.19
✎
14:19
|
(35) да не. У прединкремента и постинкремента 2, почти самый высокий. А у сложения 6.
|
|||||||||||||||||||
39
ambrozii-fadeevich-s
02.08.19
✎
14:20
|
(30) Правильно. Надо писать на чистом С.
|
|||||||||||||||||||
40
1Сергей
02.08.19
✎
14:23
|
(38) а, точно
|
|||||||||||||||||||
41
NorthWind
02.08.19
✎
14:25
|
так что в общем-то тут никакого UB нет, все достаточно логично. Хотя само выражение больше из области курьезов чем из реального программирования. Я бы так не написал, точно :)
|
|||||||||||||||||||
42
Windyhead
02.08.19
✎
14:26
|
(32) Я просто когда то эволюционировал из с++ в 1С , поэтому могу себе позволить ))
(39) мы тут этим и занимаемся, даже математика на нашей стороне С = 1С |
|||||||||||||||||||
43
patapum
02.08.19
✎
14:28
|
вариант с числом пи мне нравится
14 |
|||||||||||||||||||
44
y88
02.08.19
✎
14:36
|
(27) тогда почему 22?
i = ++i + ++i + ++i; 14 |
|||||||||||||||||||
45
ДенисЧ
02.08.19
✎
14:37
|
(41) Это UB. И это описано в докуметации.
|
|||||||||||||||||||
46
bolobol
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 |
|||||||||||||||||||
47
y88
02.08.19
✎
14:48
|
(46) похоже так. Олипиадная задачка
|
|||||||||||||||||||
48
Йохохо
02.08.19
✎
15:00
|
(46) только вот "++(++5)=7 >> 7+7 = 14" это лишнее чтение, т.к. результат первой операции уже известен. и вообще боян и (45)
|
|||||||||||||||||||
49
bolobol
02.08.19
✎
15:01
|
(48) По запросу "UB" - яндекс выдаёт: ГИБДД - официальный сайт. Вы на что намекаете??
|
|||||||||||||||||||
50
trad
02.08.19
✎
15:04
|
(44)
inc(i)inc(i)+inc(i)+ 6 7 14 8 22 |
|||||||||||||||||||
51
ДенисЧ
02.08.19
✎
15:06
|
||||||||||||||||||||
52
Dionis Sergeevich
02.08.19
✎
15:06
|
Intellij idea выдает 13
|
|||||||||||||||||||
53
1Сергей
02.08.19
✎
15:07
|
(49) Undefined Behaviour
|
|||||||||||||||||||
54
Йохохо
02.08.19
✎
15:12
|
предиктед
|
|||||||||||||||||||
55
Конструктор1С
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); сколько думаете будет? |
|||||||||||||||||||
56
bolobol
02.08.19
✎
15:30
|
(55) Слышал, что будет 42, долго считать тут
|
|||||||||||||||||||
57
Dionis Sergeevich
02.08.19
✎
15:33
|
(55) ну логично же что 1000001.0
|
|||||||||||||||||||
58
trad
02.08.19
✎
15:38
|
||||||||||||||||||||
59
mikecool
02.08.19
✎
15:44
|
вот из-за такого мозголомства и надо расписывать операции по строкам
|
|||||||||||||||||||
60
Конструктор1С
02.08.19
✎
15:47
|
(57) не-а
a = 1000001.0000000009 это распространенная багофича с числами с плавающей запятой |
|||||||||||||||||||
61
Dionis Sergeevich
02.08.19
✎
15:49
|
(60) а эта багофича с точки зрения логики как то объяснена?
|
|||||||||||||||||||
62
bolobol
02.08.19
✎
15:54
|
(61) Свободный ради-кал?
|
|||||||||||||||||||
63
Конструктор1С
02.08.19
✎
15:55
|
(61) х.з. Ну типа особенности работы с такими числами
|
|||||||||||||||||||
64
Провинциальный 1сник
02.08.19
✎
15:57
|
(19) Подавляющее большинство багов и уязвимостей в софте - именно тяжкое наследие языка Си. Писали бы на паскале - всё было бы стабильнее на порядок.
|
|||||||||||||||||||
65
Fish
02.08.19
✎
15:58
|
(64) А если бы на 1С, то стабильнее на 10 порядков :)
|
|||||||||||||||||||
66
Конструктор1С
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 вот такие пироги |
|||||||||||||||||||
67
bolobol
02.08.19
✎
16:11
|
(64) И тормознее на порядок порядков. Это не наследие Си - это сопроцессор математический
|
|||||||||||||||||||
68
Провинциальный 1сник
02.08.19
✎
16:15
|
(67) Не преувеличивайте. Софт, написанный на паскале (тот же QIP к примеру) не тормознее сишного. Си - это переносимый ассемблер, для написания ядер и драйверов. То, что его начали использовать не по назначению, огромная ошибка отрасли, которая аукается до сих пор..
|
|||||||||||||||||||
69
Глок 17
02.08.19
✎
16:15
|
(0) В уме считал по человеческой логике, получилось 13.
Проверил на компе, тоже получилось 13 13 |
|||||||||||||||||||
70
bolobol
02.08.19
✎
16:18
|
(68) Я писал программы и на том и на том - разница достигала х100 в производительности
|
|||||||||||||||||||
71
Провинциальный 1сник
02.08.19
✎
16:19
|
(70) А на ассемблере еще быстрее будет, если правильно написать.. это не аргумент. Всё зависит от конкретного компилятора и от примененного алгоритма.
|
|||||||||||||||||||
72
bolobol
02.08.19
✎
16:23
|
(71) А, ну если "не аргумент" и "от алгоритма"... тогда - "Ваша точка зрения ясна..." и бла-бла-бла- все дела
|
|||||||||||||||||||
73
Глок 17
02.08.19
✎
16:25
|
(71) Писал на ассемблере преобразователь частоты в 2/3 раза. Для считывания показаний датчика оборотов с мотора для передачи в тахометр при замене двигателя с 4х цилиндров на 6 цилиндров. Программа заняла 10 байтов, один цикл рассчетов выполнялся за 3 такта. Попробуй на паскале написать, сколько тактов займет
|
|||||||||||||||||||
74
Кирпич
02.08.19
✎
16:27
|
(70) между разными компиляторами Си тоже может быть разница х100
|
|||||||||||||||||||
75
Глок 17
02.08.19
✎
16:31
|
У кого получается не 13, вы как считали? Что за бредятина
|
|||||||||||||||||||
76
bolobol
02.08.19
✎
16:33
|
(75) "Всё не читал, но осуждаю"?
|
|||||||||||||||||||
77
Глок 17
02.08.19
✎
16:34
|
(76) По шагам расписываю:
i = ++i + ++i; 1. Считаем первое слагаемое: ++i = ++5 = 6. 6 записывается в i 2. Считаем второе слагаемое: ++i = ++6 = 7 3. Складываем оба слагаемых: 6 + 7 = 13 Куда проще? |
|||||||||||||||||||
78
Глок 17
02.08.19
✎
16:40
|
(26) >> Дело в том что инкремент записывается в одну и ту же ячейку памяти
Это ошибка. Результат двух выражений не должен записываться в одну и ту же ячейку памяти. Если бы компилятор так работал, то это был бы дичайший баг. |
|||||||||||||||||||
79
bolobol
02.08.19
✎
16:42
|
(77) То есть, всё-таки, "чукча не читатель"... в (46) и в (50) двумя вариантами описано явление 14-ти в ответ.
|
|||||||||||||||||||
80
Dionis Sergeevich
02.08.19
✎
16:44
|
(77) я думаю что тут дело в IDE - некоторые, вычисоив первое а++ запомнили значение, а не указатель, другие наоборот
|
|||||||||||||||||||
81
Глок 17
02.08.19
✎
16:45
|
(79) Так это ты чукча не читатель. Я же разжевал все подробно в (77). А в (46) вообще какой-то бред написан.
|
|||||||||||||||||||
82
Dionis Sergeevich
02.08.19
✎
16:46
|
В итоге в случае с заполненным значением 6 + 7, а с заполненной ссылкой а + а
|
|||||||||||||||||||
83
Глок 17
02.08.19
✎
16:46
|
(80) Не важно что ты запомнишь, указатель или значение. Сам подумай. Выполнилось выражение, его значение записалось в новую ячейку памяти. Выполнили то же самое выражение. С какого перепугу мы будем записывать новый результат в уже занятую ячейку, а не в новую?
|
|||||||||||||||||||
84
Dionis Sergeevich
02.08.19
✎
16:47
|
*запомненной
|
|||||||||||||||||||
85
Глок 17
02.08.19
✎
16:47
|
(82) Ссылки должно получиться две разных
|
|||||||||||||||||||
86
Глок 17
02.08.19
✎
16:48
|
++ это оператор, которые не только увеличивает значение переменной, но и ВОЗВРАЩАЕТ результат инкремента. Мы складываем не значения переменной i, а результаты, которые вернули два разных оператора инкремента.
|
|||||||||||||||||||
87
Dionis Sergeevich
02.08.19
✎
16:48
|
(83) дело в том что инкремент присваивает результат переменной, поэтому в указателе значение 7, а + а даст 14. А в случае работы со значениями - результат первого инкремента будет запомнен до второго инкремента
|
|||||||||||||||||||
88
Глок 17
02.08.19
✎
16:49
|
(87) Я заранее ответил на это чуть выше
|
|||||||||||||||||||
89
Глок 17
02.08.19
✎
16:50
|
(87) в указателе на i згачение 7. а в указателе на предыдущий результат выполнения значение 6
|
|||||||||||||||||||
90
Глок 17
02.08.19
✎
16:52
|
У (++i) и у (i) должны быть разные указатели. Иначе будет неправильный результат в виде 14.
|
|||||||||||||||||||
91
Глок 17
02.08.19
✎
16:53
|
Но по правилам хорошего программирования писать как в (0) конечно же запрещено на любом яп.
|
|||||||||||||||||||
92
Nyoko
02.08.19
✎
16:56
|
6+8=14
14 |
|||||||||||||||||||
93
Конструктор1С
02.08.19
✎
17:34
|
(92) а почему 8?
|
|||||||||||||||||||
94
Глок 17
02.08.19
✎
18:02
|
10 + 6 = 16
16 |
|||||||||||||||||||
95
v77
02.08.19
✎
18:31
|
(86) "++ это оператор, которые не только увеличивает значение переменной, но и ВОЗВРАЩАЕТ результат инкремента."
Это с сегодняшнего дня? Надо запомнить. |
|||||||||||||||||||
96
Глок 17
02.08.19
✎
18:36
|
(95) Лучше запомни если не можешь понять
|
|||||||||||||||||||
97
Глок 17
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.
|
|||||||||||||||||||
98
v77
02.08.19
✎
18:41
|
(96) Ну я как бы понимаю, что 14 получится. Вот ты не можешь понять и выдумываешь какие то новые правила и отрицаешь реальность.
14 |
|||||||||||||||||||
99
Глок 17
02.08.19
✎
18:43
|
(98) Но ты не правильно понимаешь, поэтому не хочешь принять правила, и выдумываешь свои
|
|||||||||||||||||||
100
v77
02.08.19
✎
18:44
|
(97) но создатели компиляторов Си делают по своему. от бунтари :)
|
|||||||||||||||||||
101
Глок 17
02.08.19
✎
18:46
|
(100) не все, а только криворукие.
Выражение (0) нужно упростить для однозначности, чтобы даже v77 было понятно: i = 5; ++i; a2 = i; ++i; a2 = i; i = a1 + a2; |
|||||||||||||||||||
102
Глок 17
02.08.19
✎
18:47
|
Опечатка, в первом присвоении a1 вместо а2
|
|||||||||||||||||||
103
Глок 17
02.08.19
✎
18:48
|
Если выражение вызывает непонятки, его всегда нужно раскладывать. Тогда ошибок будет меньше
|
|||||||||||||||||||
104
v77
02.08.19
✎
18:49
|
(101) Криворукие это компиляторы GCC, Microsoft и Clang, я так понимаю. А какие тогда правильные компиляторы?
|
|||||||||||||||||||
105
Глок 17
02.08.19
✎
18:49
|
(104) Там где результат 13
|
|||||||||||||||||||
106
NorthWind
02.08.19
✎
18:58
|
(105) неверно ты разложил. Подвох в том, что сначала по правилам приоритета выполняются все i++, и только потом происходит сложение. В результате складывается не 7 и 6, а 7 и 7. А если сделать ++i + ++i + ++i, то будет уже 8 + 8 + 8 = 24... ну и так далее.
|
|||||||||||||||||||
107
Глок 17
02.08.19
✎
19:02
|
(106) Ну и откуда у тебя в первом слагаемом 7, если сначала мы получаем 6? Во втором получаем 7. Затем по логике мы должны сложить результаты предыдущих вычислений, а не то что сейчас хранится в переменной i. Ты просто пытаещься подогнать логику под сишный компилятор, из-за чего она страдает.
|
|||||||||||||||||||
108
Глок 17
02.08.19
✎
19:10
|
Вот аналог того что в (0):
(i = 6) + (i = 7) Какой результат будет у этого бредового выражения? |
|||||||||||||||||||
109
Глок 17
02.08.19
✎
19:12
|
Из первых скобок выползет результат 6, из вторых выползет 7, затем они сложатся, получится 13. В i будет записано 7, но нам пофиг что там, потому что мы складываем не i + i, а результаты операций в скобках.
|
|||||||||||||||||||
110
NorthWind
02.08.19
✎
19:35
|
(107) Нет. См. (35). Там пипец какая интересная табличка. Приоритетной операцией, причем с очень высоким приоритетом, являются прединкремент. Приоритет ВЫШЕ умножения и деления! Сначала, вперед всех остальных, в данном случае выполнятся они. Сколько их будет - столько и выполнятся. И только потом пойдет сложение уже над выполненными прединкрементами. Поэтому 7 + 7.
|
|||||||||||||||||||
111
v77
02.08.19
✎
19:47
|
Надо определиться сначала о каком языке речь. В Java и C# будет 13. В Си будет 14
|
|||||||||||||||||||
112
ДенисЧ
03.08.19
✎
20:39
|
||||||||||||||||||||
113
stopa85
03.08.19
✎
20:59
|
С++ даст 14, а вот ява или си шарп 13.
14 |
|||||||||||||||||||
114
Конструктор1С
04.08.19
✎
11:41
|
(113) таки, а почему вы предлагаете ровняться на плюсы?
|
|||||||||||||||||||
115
Фрэнки
04.08.19
✎
11:43
|
(114) скажу для поддержки разговора, что 1С платформа написана на С++ :-)
|
|||||||||||||||||||
116
NorthWind
04.08.19
✎
18:30
|
(114) а таки, собственно, почему бы и нет?
|
|||||||||||||||||||
117
Глобальный_
Поиск 04.08.19
✎
20:01
|
Чё за дебильный код? Почему+++++++19 а нельзя написать +20, это кстати сэкономит байты.
|
|||||||||||||||||||
118
Глобальный_
Поиск 04.08.19
✎
20:02
|
Инкреметы они оптимизируют.ну и пишите на ассемблере тогда
|
|||||||||||||||||||
119
Глобальный_
Поиск 04.08.19
✎
20:07
|
Когда количество библиотек в миллионы раз превышает количество кода , играться плюсами и пузырьками это удел преподов на первом курсе.
|
|||||||||||||||||||
120
Глобальный_
Поиск 04.08.19
✎
20:09
|
Выдохнул :)
|
|||||||||||||||||||
121
stopa85
04.08.19
✎
21:17
|
(114) не было бы плюсов, не было бы этой загадки. Она, кстати, очень важна для понимания языка.
|
|||||||||||||||||||
122
DrZombi
гуру
05.08.19
✎
06:54
|
10 :)
Другое |
|||||||||||||||||||
123
DrZombi
гуру
05.08.19
✎
06:54
|
(117) Видимо автору языка, было так интересней извращаться :)
|
|||||||||||||||||||
124
DrZombi
гуру
05.08.19
✎
06:55
|
+(122) Тут так то не описано, что за язык, что за математика... :)
|
|||||||||||||||||||
125
Провинциальный 1сник
05.08.19
✎
11:25
|
(110) При чем тут приоритет.. Даже со всеми приоритетами, когда мы выполняем сложение, мы по логике должны взять уже рассчитанный РАНЕЕ первый операнд (++i), а не пытаться его рассчитать ЕЩЕ РАЗ после второго(++i). И будет 13. Если компилятор С++ выдает 14 - это очередное подтверждение тезиса что Си - плохой язык.
13 |
|||||||||||||||||||
126
bolobol
05.08.19
✎
12:42
|
(125) Глупости, никаких "ещё раз" в примере нет. Есть две операции увеличения i _до_сложения.
|
|||||||||||||||||||
127
Провинциальный 1сник
05.08.19
✎
13:33
|
(126) ++i - это инкремент переменной и одновременно возврат этого увеличенного значения в вызывающее выражение. То есть, если в выражении ++i встречается дважды, то и вычислено оно будет дважды.. сначала от исходного значения, потом от уже вычисленного. И только потом сложены эти промежуточные результаты. И получается 13. Вообще не понимаю, как может быть 14.
|
|||||||||||||||||||
128
Smile 8D
05.08.19
✎
13:37
|
(106) Вы так уверенно рассуждаете, но выше в (46) уже написали, что ++i + ++i + ++i дает 22, а не 24, что можно проверить в компиляторе с++, на который так же давали выше ссылку. К сожалению, при 3х слагаемых правила уже работают по другому.
|
|||||||||||||||||||
129
Smile 8D
05.08.19
✎
13:44
|
(127) Не забывайте, что ++i прибавляет и возвращает значение в выражение, а i++ сначала возвращает, а затем уже прибавляет. И ваш негатив в сторону языков, в которых это используется, вызван скорее непониманием зачем эти механизмы были придуманы. Естественно, что пример из загадки искусственный, а инкременты реально используются обычно при вызовах из разных процедур\потоков, где требуется использовать текущее значение и параллельно его изменить.
|
|||||||||||||||||||
130
Провинциальный 1сник
05.08.19
✎
13:47
|
(129) Согласен, прибавляет и возвращает. Первый операнд 6 после инкремента, второй 7 после инкремента. Потом выполяем сложение. Получаем 6+7=13. Почему 14 то???
|
|||||||||||||||||||
131
Smile 8D
05.08.19
✎
13:51
|
(130) Ну про это уже выше написали, что приоритет у операции выше, чем у сложения, даже ссылку кидали. Вы же не возмущаетесь, что умножение выполняют раньше чем сложение.
А вот почему при 3х слагаемых логика меняется мне непонятно и не нравится) |
|||||||||||||||||||
132
Провинциальный 1сник
05.08.19
✎
13:56
|
(131) Так я не спорю о приоритетах! И рассуждаю именно в смысле того, что СНАЧАЛА делаем инкременты и возвращаем значения инкрементов, и только потом складываем. Но откуда 14?
|
|||||||||||||||||||
133
bolobol
05.08.19
✎
14:03
|
(132) Ещё один "нечитатель". Ранее всё по полочкам разложено было неоднократно. И ладно когда тролль только зарегистрированный делает вид что не видит...
|
|||||||||||||||||||
134
Провинциальный 1сник
05.08.19
✎
14:09
|
(133) Блин, ну ткните пальцем, ГДЕ разжовано? Читаю, вижу логичные предпосылки, потом бац - парадоксальный вывод.
|
|||||||||||||||||||
135
Провинциальный 1сник
05.08.19
✎
14:10
|
+(134) Откуда берется семерка в первом операнде???
|
|||||||||||||||||||
136
bolobol
05.08.19
✎
14:16
|
(135) в (46) и в (50) - двумя языками изложено
|
|||||||||||||||||||
137
Провинциальный 1сник
05.08.19
✎
14:17
|
А, понял. Если строить дерево вычисления выражения по приоритетам, то будет именно 13. Но если считать сишным способом "инкремент записывается в одну и ту же ячейку памяти, и в результате к тому моменту когда надо сложить два слагаемых, складывается в реальности уже 7 и 7, а не 7 и 6", тогда понятно. Но блин, символ в одном месте выражения и в другом - это НЕ ОДНА ячейка памяти, а узел в дереве расчета. А тут получается "дерево-мутант". Си - плохой язык.
|
|||||||||||||||||||
138
bolobol
05.08.19
✎
14:24
|
(137) Позволю себе не согласиться. Использование одной и той же переменной (й+й) не должно вызывать два чтения и два помещения в разные регистры для дальнейшего сложения. Именно из-за этого, программы на Си и работают в х100 раз быстрее альтернативно одарённых языков.
|
|||||||||||||||||||
139
Провинциальный 1сник
05.08.19
✎
14:45
|
На лурке тема разжована, оказывается это древний баянище)
http://lurkmore.to/%2B%2Bi_%2B_%2B%2Bi |
|||||||||||||||||||
140
Глок 17
05.08.19
✎
17:35
|
(110) Ты не понял. Понятно что инкремент имеет высокий приоритет. Но почему ты продолжаешь складывать 7 + 7, если результаты инкоементов нам дали два слагаемых: 6 и 7?
|
|||||||||||||||||||
141
Глок 17
05.08.19
✎
17:43
|
(138) >> Именно из-за этого, программы на Си и работают в х100 раз быстрее альтернативно одарённых языков.
Ага. Только выдают не тот результат, который нужен. Главное быстро :))) |
|||||||||||||||||||
142
Глок 17
05.08.19
✎
17:45
|
Чтобы выражение (0) правильно работало на Си, нужно его преобразовать:
int i = 5; int tmp = ++i; i = tmp + ++i; |
|||||||||||||||||||
143
stopa85
07.08.19
✎
19:16
|
(127) нет не правильно. В С++ операция ++i возвращает ссылку на объект (указатель на область памяти, где записано значение), а не копию объекта. Ты путаешь с java и c#.
Вот и получается, что по этому указателю в ОЗУ компьютера находится значение и увеличивается на 1. Потом оно находится еще раз и увеличивается на один еще раз. Потом складывается само с собой. Это нужно понимать. Это, что ли, философия языка. |
|||||||||||||||||||
144
ambrozii-fadeevich-s
09.08.19
✎
11:11
|
(139) Это намного древнее баянище.
(142) |
|||||||||||||||||||
145
ambrozii-fadeevich-s
09.08.19
✎
11:14
|
(142) Если правильно преобразовать, то получится не то, что ожидает среднестатистический интерпретатор
int i = 5; ++i; ++i; i = i + i; |
|||||||||||||||||||
146
ambrozii-fadeevich-s
09.08.19
✎
11:15
|
пятница же!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |