На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (5) 1 [2] 3 4 ... Последняя » все  ( Перейти к последнему сообщению )  
> undefined/unspecified , точки следования, короче
    Ну хочется прогерам жить так - пущай, чёрт с вами. Впрочем, думается мне, что с годами всё же будут стараться избавиться от неопределённостей. ;)

    Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
      Цитата Славян @
      А) Годьте! Если только на этапе оптимизации, то это проблема недоделанного оптимизатора. Пусть осторожней работает! Если же не только, то давайте смотреть этот обыденный случай.

      Так он и так работает осторожно, это кто то просто не понимает ЯП до конца.

      Цитата Славян @
      Б) Я не шибко улавливаю фразу "точка следования" (только путём общелогических умозаключений), так что расскажите попроще на этом простом примере, что тут не так?

      Не так тут то, что запятая в аргументах функций - не является точкой следования, только в выражениях. Соответственно компилятор - в праве переупорядочивать операции по своему усмотрению. И это с точки зрения языка - правильно.
      Другими словами тут есть неоднозначности, на которые выше уже указал тебе.
      Ты ждешь 3,4 - а почему не 4,4?


      Цитата Славян @
      Всё же просто: вызов с двумя аргументами, кои записаны подряд, а значит и вычисляться должны подряд! Так что f(3,4);

      Так ты передаешь в эти аргументы одну и ту же область памяти - при чем два раза инкрементировав ее содержимое, и на выходе ожидаешь почему то 3,4. :-?

      Цитата Славян @
      Ещё раз напомню, что шаманство компилятора при оптимизации - его изъян; пусть хуже оптимизирует, но не допускает ошибок/двузначностей.

      Это такое соглашения в ЯП, а не ошибка оптимизации.

      Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
        Цитата Wound @
        Ты ждешь 3,4 - а почему не 4,4?
        Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. :yes:

        Цитата Wound @
        Так ты передаешь в эти аргументы одну и ту же область памяти - при чем два раза инкрементировав ее содержимое, и на выходе ожидаешь почему то 3,4.
        Нет никаких "двух раз"! Есть вызов, с двумя аргументами. Рубим первый, а потом - второй. Как и пишем!!! Всё железобетонно!

        Не понимаю ваших аргументов, абсолютно. :yes-sad:
        Причём, очень хочу понять, честно, но никак не вижу. :'(

        Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
          Цитата Славян @
          Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. :yes:

          Где логично то? По твоему после передачи первого аргумента в функцию - должно выполнится тело функции?

          Бред какой то. Ты передаешь одну переменную, не две. А одну. Куда компилятор запишет значение 3, а куда 4?


          Цитата Славян @
          Нет никаких "двух раз"! Есть вызов, с двумя аргументами. Рубим первый, а потом - второй. Как и пишем!!! Всё железобетонно!

          :scratch: Как это нет? У тебя переменная 1 - i, куда будут сохранены значения двух аргументов по твоему?


          Цитата Славян @
          Не понимаю ваших аргументов, абсолютно. :yes-sad:
          Причём, очень хочу понять, честно, но никак не вижу. :'(

          Что не понятного?
          Сначало вычисляются значения переменных, а уж потом идет передача в функцию. А ты как хотел? Сначало передать, а потом вычислить? Ну тогда логичнее ожидать 2,2, а не 3,4.

          Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
            Цитата Wound @
            Ты передаешь одну переменную, не две.
            Он о том, что, по его мнению, аргументы должны вычисляться слева направо и между их вычислениями должны быть точки следования. Возможно, для какого-то абстрактного языка это будет хорошо и правильно, но точно не для С++.

            Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
              Цитата Wound @
              Где логично то? По твоему после передачи первого аргумента в функцию - должно выполниться тело функции?
              Нет такого по-моему! Я такого не вещал. Сначала - аргументы, потом - тело, всё по порядку! :yes:

              Цитата Wound @
              Ты передаешь одну переменную, не две. А одну. Куда компилятор запишет значение 3, а куда 4?
              Я не передаю переменную!!! :facepalm: Я передаю число=значение, посредством изменения такой-то переменной! Запишет он 3 в переменную, значение коей надо передать в первом аргументе, а потом запишет в неё 4, что и надо послать вторым. Как он выпутается - его грабли, а не мои, писателя проги!!! :wall: :wall: :wall:

              Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                Цитата Славян @
                Потому что первым идёт 3, а потом (дойдя до второго) оно становится 4. Всё логично. :yes:

                Вот у тебя есть переменная X
                И есть функция Sum, принимающаяя 2 аргумента -> int Sum(int x, int y)
                Изначально X = 2
                передай в эту функцию одну переменную X, в два аргумента так, чтобы внутри функции первый был равен 3, а второй 4, без использования других токенов.
                Вызов функции должен быть такой:
                ExpandedWrap disabled
                  int X = 2;
                  //! Тут твой код
                  Sum(X, X);

                Напиши код на месте коментария, чтоб внутри функции один аргумент был равен 3, а второй 4.

                Добавлено
                Цитата Славян @
                Нет такого по-моему! Я такого не вещал. Сначала - аргументы, потом - тело, всё по порядку! :yes:

                Пиши вот так:
                ExpandedWrap disabled
                  Func(i+1, i+2)

                И будет тебе счастье.

                Цитата Славян @
                Я не передаю переменную!!! :facepalm: Я передаю число=значение,

                Нет, ты передаешь конкретный идентификатор к которому применяется инкремент - это есть сайд эффект. Вот если бы ты просто передавал переменную, без ее изменения, вопросов бы не возникало.

                Цитата Славян @
                Я передаю число=значение, посредством изменения такой-то переменной!

                Представь что вместо числа, у тебя std::string, а вместо ++ - у тебя replace который изменяет вызывающий его объект, два раза причем.

                Цитата Славян @
                Запишет он 3 в переменную, значение коей надо передать в первом аргументе, а потом запишет в неё 4, что и надо послать вторым. Как он выпутается - его грабли, а не мои, писателя проги!!! :wall: :wall: :wall:

                Ээээ... В какую переменную?

                Добавлено
                1 + 2 * 6 = 9
                Все логично. Пущай там математики покумекают, и сделают мне чтобы было так, как я хочу :D

                Добавлено
                Цитата OpenGL @
                Он о том, что, по его мнению, аргументы должны вычисляться слева направо и между их вычислениями должны быть точки следования. Возможно, для какого-то абстрактного языка это будет хорошо и правильно, но точно не для С++.

                Да я понимаю о чем он. Просто пытаюсь в рамках текущего стандарта пояснить ему что происходит.

                Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                  Цитата Wound @
                  Напиши код на месте коментария, чтоб внутри функции один аргумент был равен 3, а второй 4.
                  Идеал выглядел бы как-то так:
                  ExpandedWrap disabled
                    int X = 2;
                    //! Тут мой код:
                    // 1.Создаём область памяти в две ячейки, к коим никто не может обратиться (дабы не ломали, ...);
                    // 2.Пишем в каждую ячейку: ++X в первую, ++X во вторую (получили пару (3;4);
                    // 3.Кормим функции Sum значения из ячеек. Бинго.
                    Sum(еда1, еда2);


                  Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                    Цитата Славян @
                    int X = 2;
                    //! Тут мой код:
                    // 1.Создаём область памяти в две ячейки, к коим никто не может обратиться (дабы не ломали, ...);
                    // 2.Пишем в каждую ячейку: ++X в первую, ++X во вторую (получили пару (3;4);
                    // 3.Кормим функции Sum значения из ячеек. Бинго.
                    Sum(еда1, еда2);

                    А как быть с указателями и ссылочными типами данных? Как быть со сложными объектами? Ты понимаешь что передавать int по ссылке не имеет смысла, так как все сведетя к указателю, кой и есть по сути int ?
                    И в чем тогда будет преимущество С++ перед другими ЯП?

                    Добавлено
                    Т.е. передача любого объекта в функцию - делает копию объекта, в итоге как передавать массив из 1000000 элементов?

                    Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                      Ага! Т.е. выход нашёлся, но теперь начались наезды на какие-то другие последствия? Давайте всё же разбирать тогда каждый, а то ваш способ заваливать горой вопросов, конечно, неплох, но труден для развёрнутых ответов. :yes-sad:

                      Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                        А я, пожалуй, дровишек подкину ... :lol:

                        Один:
                        Скрытый текст
                        ExpandedWrap disabled
                          int func(int a, int b) {
                            return a+b;    
                          }
                              
                          int main() {
                            int i = 0;  
                            func(++i,++i);
                            return 0;
                          }


                        ему соответствует:

                        ExpandedWrap disabled
                          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

                        Два:
                        Скрытый текст
                        ExpandedWrap disabled
                          int func(int &a, int &b) {
                            return a+b;    
                          }
                              
                          int main() {
                            int i = 0;  
                            func(++i,++i);
                            return 0;
                          }


                        ему соответствует:

                        ExpandedWrap disabled
                          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

                        Сравнение:
                        user posted image

                        Господа, к барьеру! :lol:

                        PS: Компилятор clang 6.0.0 (x86_64)

                        Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                          Цитата Славян @
                          Ага! Т.е. выход нашёлся, но теперь начались наезды на какие-то другие последствия?

                          В смысле выход нашелся? Не нашелся ведь. Твоя проблема в том, что ты рассматриваешь только int'ы, а другие типы данных не рассматриваешь. Я тебя специально подтолкнул к тому, чтобы ты написал - как по твоему это должно работать. Ты и написал по твоему мнению решение, которое должно работать для int'ов, но упускаешь из виду другие типы данных + другую семантику передачи параметров в функции. А ведь это примитивный случай.
                          Плюс ко всему, аргументы функций - не зависят друг от друга, соответственно могут быть вычисленны вообще паралельно друг от друга. Если тебе нужен строгий порядок выполнения - переходи на Java/C#, там порядок строго определен, ну и с указателями нет мороки тоже.

                          Сообщения были разделены в тему "undefined/unspecified"

                          Это сообщение было перенесено сюда или объединено из темы "Текущий Стандарт С++ и перспективы его развития"
                            Цитата Wound @
                            В смысле выход нашелся? Не нашелся ведь.
                            Нашёлся, - я ж показал правильный ход построения вызова функции.

                            Цитата Wound @
                            Твоя проблема в том, что ты рассматриваешь только int'ы, а другие типы данных не рассматриваешь.
                            Нет у меня проблем, не сочиняйте. ;)

                            Цитата Wound @
                            Ты и написал по твоему мнению решение, которое должно работать для int'ов, но упускаешь из виду другие типы данных + другую семантику передачи параметров в функции. А ведь это примитивный случай.
                            Так в том же и фишка, что на предложенный вариант - предложил решение. А вы сразу задались вопросом про общий случай. Да чёрт его знает как в общем, это проблема компилятора, но в этом конкретном частном - всё должно решиться без ваших UB.

                            Цитата Wound @
                            Плюс ко всему, аргументы функций - не зависят друг от друга, соответственно могут быть вычисленны вообще паралельно друг от друга.
                            Может выполнить компилер параллельно, не впадая в депрессию UB, - пусть делает; а не может - пусть делает по порядку аргументов. Всё норм! :yes:

                            Добавлено
                            Цитата JoeUser @
                            А я, пожалуй, дровишек подкину ...
                            Один:
                            Ну здесь Clang справился на отлично (не считая того, что он забил на i).

                            Эта тема была разделена из темы "Текущий Стандарт С++ и перспективы его развития"
                              Цитата Славян @
                              Нашёлся, - я ж показал правильный ход построения вызова функции.

                              С чего это он правильный? Потому что тебе так кажется?

                              Цитата Славян @
                              Нет у меня проблем, не сочиняйте. ;)

                              Ну как нет, если есть. Тебе же не понятно почему вот так, а не вод эдак.

                              Цитата Славян @
                              Так в том же и фишка, что на предложенный вариант - предложил решение.

                              Так не предложил же. Ты исказил условие данной тебе задачи. Т.е. ты подогнал задачу под свой ответ. Я то тебе другой вопрос задал.

                              Цитата Славян @
                              А вы сразу задались вопросом про общий случай. Да чёрт его знает как в общем, это проблема компилятора, но в этом конкретном частном - всё должно решиться без ваших UB.

                              Нет не должно. Тут уж тебе нужно выбрать - не нравится инструмент берешь тот, который тебе по душе. А ты предлагаешь убить быстродействие в угоду каких то своих хотелок. Почему бы тогда не взять соответствующий для этого инструмент?

                              Цитата Славян @
                              Может выполнить компилер параллельно, не впадая в депрессию UB, - пусть делает; а не может - пусть делает по порядку аргументов. Всё норм! :yes:

                              Так порядок вычисления аргументов не определен. :jokingly:
                              Ты странный какой то. Ей богу.
                                Цитата Wound @
                                С чего это он правильный? Потому что тебе так кажется?
                                Потому что я аргументировал: читается текст слева направо, параллельно сделать нельзя, пусть делает как читается.

                                Цитата Wound @
                                А ты предлагаешь убить быстродействие в угоду каких то своих хотелок.
                                Неправда. Я предлагаю забить на быстродействие в угоду понятливости да естественности записи кода. Можно сделать быстро - делайте, нельзя - начхать, не судьба.

                                Цитата Wound @
                                Почему бы тогда не взять соответствующий для этого инструмент?
                                Так инструменты ж создаются для той или иной записи выражений, языка расчёта. Си (Си++) был выбран таким, пусть теперь ворочается на своих, местами трудных, тропинках. А не так что: ничего не знаем - выполняем как захотим.

                                Цитата Wound @
                                Так порядок вычисления аргументов не определен.
                                Да я понял. Не понял только отчего забили.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0799 ]   [ 16 queries used ]   [ Generated: 28.03.24, 21:57 GMT ]