На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (7) « Первая ... 3 4 [5] 6 7  все  ( Перейти к последнему сообщению )  
> Чистота кода VS оптимизация
    Цитата Jin X @
    Если под ленивой ты подразумеваешь проверку одного условия из 2-х (если оно true для ||), то отчего ж && не ленивая (при первом false)?

    && тоже ленивая уж. Имеется ввиду, что || в моём предложении ты можешь заменить на &&, а | на &.
      Вот, блин!
      В JS:
      5&&1 = 1, а 1&&5 = 5
      5||0 = 5 и 0||5 = 5 (почему одинаково - понятно, но почему не true/false?)
      Чё за бред? :wall:

      p.s. В сях всё нормально работает: везде выдаёт 1 или true (в т.ч. для 2&&1 и 1&&~1, что ожидаемо).

      Добавлено
      Цитата OpenGL @
      Имеется ввиду, что || в моём предложении ты можешь заменить на &&, а | на &.
      Что??? :blink:

      Добавлено
      OpenGL, ты имеешь в виду, что && и || ленивые в отличие от & и | ?
      А разве основная ценность в этой ленивости? И это достаточная причина, чтобы не делать ^^ ?
      Ну реально бывает (редко, но бывает), что нужно сделать (x ^^ y). Можно, конечно, написать (!x != !y), но это тоже не вот прям офигеть как читаемо :)
      Сообщение отредактировано: Jin X -
        Цитата Jin X @
        Хотя нет, не тормознул...
        Ну это не серьёзно. Типы данных разные, и && и &, равно как и || и |, определены для разных типов, для которых есть взаимные касты, тогда как != одна на все типы, и кастов не требуется. Ты же не думаешь, что за типами следить не надо? А то я как-то видал в коде if(a != true), было весело писать багрепорты.
          Цитата Qraizer @
          Ты же не думаешь, что за типами следить не надо?
          Надо, но всегда ли есть смысл писать if (x != 0), когда можно написать просто if (x) ?
          А в случае с xor как-то тоже бредово выглядит if ((x && !y) || (!x && y)) и аналогично if ((x!=0 && y==0) || (x==0 && y!=0)).
          Как ты предлагаешь реализовать xor, чтобы получилось красиво?

          Добавлено
          Цитата Jin X @
          тоже бредово выглядит
          Или:
          ExpandedWrap disabled
            bool boolX = x, boolY = y;
            if (boolX != boolY) {...}
          тоже не айс...

          if ((bool)x != (bool)y) :no:

          Добавлено
          В JS соответственно:
          ExpandedWrap disabled
            var boolX=!!x, boolY=!!y;
            if (boolX != boolY) {...}
          Сообщение отредактировано: Jin X -
            Цитата Jin X @
            OpenGL, ты имеешь в виду, что && и || ленивые в отличие от & и | ?

            Да.

            Добавлено
            Цитата Jin X @
            А разве основная ценность в этой ленивости? И это достаточная причина, чтобы не делать ^^ ?

            Имхо, да. Из-за ленивости ты сможешь написать что-то наподобие if(index < a.len() && a[index] < 42), и замена && на & тут не прокатит. ^^ же ровно с тем же успехом в большинстве случаев заменяется на ^.

            Цитата Jin X @
            Ну реально бывает (редко, но бывает), что нужно сделать (x ^^ y).

            Когда x и y не булевские, и просто конвертятся неявным кастом? Я в этом случае просто сам сравниваю с нулём. Т.е. как-то if ((x != 0) ^ (y != 0)) пишу.
              Периодически встречаются конструкции вида if x % 1 == 0 или if not 1 % 1 — проверка на целое (python)
              Или n = ~~(n/5) — деление нацело (JS)
              Прикольно, конечно, но в "чистоте" такого кода у меня сомнения...
                Цитата Jin X @
                Надо, но всегда ли есть смысл писать if (x != 0), когда можно написать просто if (x) ?

                Почему нет? В языках без неявного приведения к bool писать != 0 не напрягает совершенно.
                  Цитата Jin X @
                  Вот, блин!
                  В JS:
                  5&&1 = 1, а 1&&5 = 5
                  5||0 = 5 и 0||5 = 5 (почему одинаково - понятно, но почему не true/false?)
                  Чё за бред?

                  Я же написал даже, что есть языки, где операнды возвращают значение, а не булев результат: Чистота кода VS оптимизация (сообщение #3766081) пункт номер 1 ;)
                    Цитата OpenGL @
                    Т.е. как-то if ((x != 0) ^ (y != 0)) пишу.
                    Вариант, конечно (тогда можно использовать != – так понятнее).
                    Но это точно лучше, чем if (x ^^ y) (если бы он был)?

                    Добавлено
                    Цитата Serafim @
                    Я же написал даже, что есть языки, где операнды возвращают значение, а не булев результат
                    Сенькс. В Java так же?
                      Цитата Jin X @
                      Это точно лучше, чем if (x ^^ y) (если бы он был)?

                      Зависит от того, как ты относишься к неявным кастам чисел к bool :-? Я вот за пределами олимпиад стараюсь их избегать, и поэтому даже if (a && b) у меня выглядит как if (a != 0 && b != 0)
                        ExpandedWrap disabled
                          #define XOR(a, b) (bool(a) != bool(b))
                          . . .
                          if (XOR(x, y)) {...}
                        :P
                        Сообщение отредактировано: Jin X -
                          Цитата Jin X @
                          Сенькс. В Java так же?

                          Я не помню, кажется там каст к булеву. Тут тебе Астарот поможет.

                          А в Ruby и JS - 146% возврат значения. Плюс, в рубях и котлине сами операторы могут возвращать значение, типа:
                          ExpandedWrap disabled
                            return if (errValue || errValue2) {
                              throw Exception("Whoops!")
                            } else {
                              print("OK")
                              do();
                              true
                            }
                          Сообщение отредактировано: Serafim -
                            Цитата Serafim @
                            Плюс, в рубях и котлине сами операторы могут возвращать значение
                            C++
                            ExpandedWrap disabled
                              int func(int val)
                              {
                                return val ? (printf("%d ", val), 2) : -1;
                              }
                               
                              int main()
                              {
                                int x;
                                scanf("%d", &x);
                                printf("%d\n", func(x));
                                return 0;
                              }


                            Добавлено
                            Или так :)
                            ExpandedWrap disabled
                              int func(int val)
                              {
                                return val ? ({int x = val*5; printf("%d ", x); 2;}) : -1;
                              }
                               
                              int main()
                              {
                                int x;
                                scanf("%d", &x);
                                printf("%d\n", func(x));
                                return 0;
                              }
                              ммм. А как тема "Чистота кода VS оптимизация" превратилась в соревнование кто по-уродливее код написать может? :unsure:
                                Это значит, что любой оператор (хотя в котлине вроде только if):
                                ExpandedWrap disabled
                                  verifyItems = (...args) => (i or throw Error "asd" for i of args).length


                                Применение для каждого элемента args функции, которая в случае элемента, который равен false вернёт ошибку, в остальных случаях значение аккумулируется и от него берётся length, т.е. количество элементов в результате (этот ваш незамысловатый i++ в if условии).

                                А вот даже можно собрать это всё
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (7) « Первая ... 3 4 [5] 6 7  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0507 ]   [ 15 queries used ]   [ Generated: 28.04.24, 15:23 GMT ]