Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.166.170.195] |
|
Страницы: (5) 1 [2] 3 4 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ну хочется прогерам жить так - пущай, чёрт с вами. Впрочем, думается мне, что с годами всё же будут стараться избавиться от неопределённостей.
Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#17
,
|
|
|
Цитата Славян @ А) Годьте! Если только на этапе оптимизации, то это проблема недоделанного оптимизатора. Пусть осторожней работает! Если же не только, то давайте смотреть этот обыденный случай. Так он и так работает осторожно, это кто то просто не понимает ЯП до конца. Цитата Славян @ Б) Я не шибко улавливаю фразу "точка следования" (только путём общелогических умозаключений), так что расскажите попроще на этом простом примере, что тут не так? Не так тут то, что запятая в аргументах функций - не является точкой следования, только в выражениях. Соответственно компилятор - в праве переупорядочивать операции по своему усмотрению. И это с точки зрения языка - правильно. Другими словами тут есть неоднозначности, на которые выше уже указал тебе. Ты ждешь 3,4 - а почему не 4,4? Цитата Славян @ Всё же просто: вызов с двумя аргументами, кои записаны подряд, а значит и вычисляться должны подряд! Так что f(3,4); Так ты передаешь в эти аргументы одну и ту же область памяти - при чем два раза инкрементировав ее содержимое, и на выходе ожидаешь почему то 3,4. Цитата Славян @ Ещё раз напомню, что шаманство компилятора при оптимизации - его изъян; пусть хуже оптимизирует, но не допускает ошибок/двузначностей. Это такое соглашения в ЯП, а не ошибка оптимизации. Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#18
,
|
|
|
Цитата Wound @ Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. Ты ждешь 3,4 - а почему не 4,4? Цитата Wound @ Нет никаких "двух раз"! Есть вызов, с двумя аргументами. Рубим первый, а потом - второй. Как и пишем!!! Всё железобетонно!Так ты передаешь в эти аргументы одну и ту же область памяти - при чем два раза инкрементировав ее содержимое, и на выходе ожидаешь почему то 3,4. Не понимаю ваших аргументов, абсолютно. Причём, очень хочу понять, честно, но никак не вижу. Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#19
,
|
|
|
Цитата Славян @ Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. Где логично то? По твоему после передачи первого аргумента в функцию - должно выполнится тело функции? Бред какой то. Ты передаешь одну переменную, не две. А одну. Куда компилятор запишет значение 3, а куда 4? Цитата Славян @ Нет никаких "двух раз"! Есть вызов, с двумя аргументами. Рубим первый, а потом - второй. Как и пишем!!! Всё железобетонно! Как это нет? У тебя переменная 1 - i, куда будут сохранены значения двух аргументов по твоему? Цитата Славян @ Не понимаю ваших аргументов, абсолютно. Причём, очень хочу понять, честно, но никак не вижу. Что не понятного? Сначало вычисляются значения переменных, а уж потом идет передача в функцию. А ты как хотел? Сначало передать, а потом вычислить? Ну тогда логичнее ожидать 2,2, а не 3,4. Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#20
,
|
|
|
Цитата Wound @ Он о том, что, по его мнению, аргументы должны вычисляться слева направо и между их вычислениями должны быть точки следования. Возможно, для какого-то абстрактного языка это будет хорошо и правильно, но точно не для С++.Ты передаешь одну переменную, не две. Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#21
,
|
|
|
Цитата Wound @ Нет такого по-моему! Я такого не вещал. Сначала - аргументы, потом - тело, всё по порядку! Где логично то? По твоему после передачи первого аргумента в функцию - должно выполниться тело функции? Цитата Wound @ Я не передаю переменную!!! Я передаю число=значение, посредством изменения такой-то переменной! Запишет он 3 в переменную, значение коей надо передать в первом аргументе, а потом запишет в неё 4, что и надо послать вторым. Как он выпутается - его грабли, а не мои, писателя проги!!! Ты передаешь одну переменную, не две. А одну. Куда компилятор запишет значение 3, а куда 4? Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#22
,
|
|
|
Цитата Славян @ Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. Вот у тебя есть переменная X И есть функция Sum, принимающаяя 2 аргумента -> int Sum(int x, int y) Изначально X = 2 передай в эту функцию одну переменную X, в два аргумента так, чтобы внутри функции первый был равен 3, а второй 4, без использования других токенов. Вызов функции должен быть такой: int X = 2; //! Тут твой код Sum(X, X); Напиши код на месте коментария, чтоб внутри функции один аргумент был равен 3, а второй 4. Добавлено Цитата Славян @ Нет такого по-моему! Я такого не вещал. Сначала - аргументы, потом - тело, всё по порядку! Пиши вот так: Func(i+1, i+2) И будет тебе счастье. Цитата Славян @ Я не передаю переменную!!! Я передаю число=значение, Нет, ты передаешь конкретный идентификатор к которому применяется инкремент - это есть сайд эффект. Вот если бы ты просто передавал переменную, без ее изменения, вопросов бы не возникало. Цитата Славян @ Я передаю число=значение, посредством изменения такой-то переменной! Представь что вместо числа, у тебя std::string, а вместо ++ - у тебя replace который изменяет вызывающий его объект, два раза причем. Цитата Славян @ Запишет он 3 в переменную, значение коей надо передать в первом аргументе, а потом запишет в неё 4, что и надо послать вторым. Как он выпутается - его грабли, а не мои, писателя проги!!! Ээээ... В какую переменную? Добавлено 1 + 2 * 6 = 9 Все логично. Пущай там математики покумекают, и сделают мне чтобы было так, как я хочу Добавлено Цитата OpenGL @ Он о том, что, по его мнению, аргументы должны вычисляться слева направо и между их вычислениями должны быть точки следования. Возможно, для какого-то абстрактного языка это будет хорошо и правильно, но точно не для С++. Да я понимаю о чем он. Просто пытаюсь в рамках текущего стандарта пояснить ему что происходит. Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#23
,
|
|
|
Цитата Wound @ Идеал выглядел бы как-то так:Напиши код на месте коментария, чтоб внутри функции один аргумент был равен 3, а второй 4. int X = 2; //! Тут мой код: // 1.Создаём область памяти в две ячейки, к коим никто не может обратиться (дабы не ломали, ...); // 2.Пишем в каждую ячейку: ++X в первую, ++X во вторую (получили пару (3;4); // 3.Кормим функции Sum значения из ячеек. Бинго. Sum(еда1, еда2); Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#24
,
|
|
|
Цитата Славян @ int X = 2; //! Тут мой код: // 1.Создаём область памяти в две ячейки, к коим никто не может обратиться (дабы не ломали, ...); // 2.Пишем в каждую ячейку: ++X в первую, ++X во вторую (получили пару (3;4); // 3.Кормим функции Sum значения из ячеек. Бинго. Sum(еда1, еда2); А как быть с указателями и ссылочными типами данных? Как быть со сложными объектами? Ты понимаешь что передавать int по ссылке не имеет смысла, так как все сведетя к указателю, кой и есть по сути int ? И в чем тогда будет преимущество С++ перед другими ЯП? Добавлено Т.е. передача любого объекта в функцию - делает копию объекта, в итоге как передавать массив из 1000000 элементов? Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#25
,
|
|
|
Ага! Т.е. выход нашёлся, но теперь начались наезды на какие-то другие последствия? Давайте всё же разбирать тогда каждый, а то ваш способ заваливать горой вопросов, конечно, неплох, но труден для развёрнутых ответов.
Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#26
,
|
|
|
А я, пожалуй, дровишек подкину ...
Один: Скрытый текст int func(int a, int b) { return a+b; } int main() { int i = 0; func(++i,++i); return 0; } ему соответствует: func(int, int): # @func(int, int) push rbp mov rbp, rsp mov dword ptr [rbp - 4], edi mov dword ptr [rbp - 8], esi mov esi, dword ptr [rbp - 4] add esi, dword ptr [rbp - 8] mov eax, esi pop rbp ret main: # @main push rbp mov rbp, rsp sub rsp, 16 mov dword ptr [rbp - 4], 0 mov dword ptr [rbp - 8], 0 mov eax, dword ptr [rbp - 8] add eax, 1 mov dword ptr [rbp - 8], eax mov ecx, dword ptr [rbp - 8] add ecx, 1 mov dword ptr [rbp - 8], ecx mov edi, eax mov esi, ecx call func(int, int) xor ecx, ecx mov dword ptr [rbp - 12], eax # 4-byte Spill mov eax, ecx add rsp, 16 pop rbp ret Два: Скрытый текст int func(int &a, int &b) { return a+b; } int main() { int i = 0; func(++i,++i); return 0; } ему соответствует: func(int&, int&): # @func(int&, int&) push rbp mov rbp, rsp mov qword ptr [rbp - 8], rdi mov qword ptr [rbp - 16], rsi mov rsi, qword ptr [rbp - 8] mov eax, dword ptr [rsi] mov rsi, qword ptr [rbp - 16] add eax, dword ptr [rsi] pop rbp ret main: # @main push rbp mov rbp, rsp sub rsp, 16 lea rax, [rbp - 8] mov dword ptr [rbp - 4], 0 mov dword ptr [rbp - 8], 0 mov ecx, dword ptr [rbp - 8] add ecx, 1 mov dword ptr [rbp - 8], ecx mov ecx, dword ptr [rbp - 8] add ecx, 1 mov dword ptr [rbp - 8], ecx mov rdi, rax mov rsi, rax call func(int&, int&) xor ecx, ecx mov dword ptr [rbp - 12], eax # 4-byte Spill mov eax, ecx add rsp, 16 pop rbp ret Сравнение: Господа, к барьеру! PS: Компилятор clang 6.0.0 (x86_64) Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#27
,
|
|
|
Цитата Славян @ Ага! Т.е. выход нашёлся, но теперь начались наезды на какие-то другие последствия? В смысле выход нашелся? Не нашелся ведь. Твоя проблема в том, что ты рассматриваешь только int'ы, а другие типы данных не рассматриваешь. Я тебя специально подтолкнул к тому, чтобы ты написал - как по твоему это должно работать. Ты и написал по твоему мнению решение, которое должно работать для int'ов, но упускаешь из виду другие типы данных + другую семантику передачи параметров в функции. А ведь это примитивный случай. Плюс ко всему, аргументы функций - не зависят друг от друга, соответственно могут быть вычисленны вообще паралельно друг от друга. Если тебе нужен строгий порядок выполнения - переходи на Java/C#, там порядок строго определен, ну и с указателями нет мороки тоже. Сообщения были разделены в тему "undefined/unspecified" Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#28
,
|
|
|
Цитата Wound @ Нашёлся, - я ж показал правильный ход построения вызова функции.В смысле выход нашелся? Не нашелся ведь. Цитата Wound @ Нет у меня проблем, не сочиняйте. Твоя проблема в том, что ты рассматриваешь только int'ы, а другие типы данных не рассматриваешь. Цитата Wound @ Так в том же и фишка, что на предложенный вариант - предложил решение. А вы сразу задались вопросом про общий случай. Да чёрт его знает как в общем, это проблема компилятора, но в этом конкретном частном - всё должно решиться без ваших UB.Ты и написал по твоему мнению решение, которое должно работать для int'ов, но упускаешь из виду другие типы данных + другую семантику передачи параметров в функции. А ведь это примитивный случай. Цитата Wound @ Может выполнить компилер параллельно, не впадая в Плюс ко всему, аргументы функций - не зависят друг от друга, соответственно могут быть вычисленны вообще паралельно друг от друга. Добавлено Цитата JoeUser @ Ну здесь Clang справился на отлично (не считая того, что он забил на i).А я, пожалуй, дровишек подкину ... Один: Эта тема была разделена из темы "Текущий Стандарт С++ и перспективы его развития" |
Сообщ.
#29
,
|
|
|
Цитата Славян @ Нашёлся, - я ж показал правильный ход построения вызова функции. С чего это он правильный? Потому что тебе так кажется? Цитата Славян @ Нет у меня проблем, не сочиняйте. Ну как нет, если есть. Тебе же не понятно почему вот так, а не вод эдак. Цитата Славян @ Так в том же и фишка, что на предложенный вариант - предложил решение. Так не предложил же. Ты исказил условие данной тебе задачи. Т.е. ты подогнал задачу под свой ответ. Я то тебе другой вопрос задал. Цитата Славян @ А вы сразу задались вопросом про общий случай. Да чёрт его знает как в общем, это проблема компилятора, но в этом конкретном частном - всё должно решиться без ваших UB. Нет не должно. Тут уж тебе нужно выбрать - не нравится инструмент берешь тот, который тебе по душе. А ты предлагаешь убить быстродействие в угоду каких то своих хотелок. Почему бы тогда не взять соответствующий для этого инструмент? Цитата Славян @ Может выполнить компилер параллельно, не впадая в депрессию UB, - пусть делает; а не может - пусть делает по порядку аргументов. Всё норм! Так порядок вычисления аргументов не определен. Ты странный какой то. Ей богу. |
Сообщ.
#30
,
|
|
|
Цитата Wound @ Потому что я аргументировал: читается текст слева направо, параллельно сделать нельзя, пусть делает как читается.С чего это он правильный? Потому что тебе так кажется? Цитата Wound @ Неправда. Я предлагаю забить на быстродействие в угоду понятливости да естественности записи кода. Можно сделать быстро - делайте, нельзя - начхать, не судьба.А ты предлагаешь убить быстродействие в угоду каких то своих хотелок. Цитата Wound @ Так инструменты ж создаются для той или иной записи выражений, языка расчёта. Си (Си++) был выбран таким, пусть теперь ворочается на своих, местами трудных, тропинках. А не так что: ничего не знаем - выполняем как захотим.Почему бы тогда не взять соответствующий для этого инструмент? Цитата Wound @ Да я понял. Не понял только отчего забили. Так порядок вычисления аргументов не определен. |