1. C# / Говнокод #19909

    +7

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    using System;
    
    public class Test
    {
    	 private static void Main(string[] args)
            {
                int d = 2147483647;
    
                Console.WriteLine(d);
    
                long g = 2147483647+d;
    
                Console.WriteLine(g);
    
                long k = new MyClass() + new MyClass();
    
                Console.WriteLine(k);
            }
    
            public class MyClass
            {
                public static implicit operator int(MyClass m)
                {
                    return 5;
                }
    
                public static implicit operator long(MyClass m)
                {
                    return 100;
                }
            }
    }

    Типушня

    Запостил: kegdan, 30 Апреля 2016

    Комментарии (48) RSS

    • https://ideone.com/2yiR7w
      Ответить
      • Коллекция гранат, которые можно бросить себе под ноги в случае опасности.
        Ответить
    • Я правильно понимаю, что + срёт на тип переменной, которой присваивается его результат, и кастит всё в int?
      Ответить
      • > тип переменной, которой присваивается его результат
        А он его и не знает. Это ж не хаскель.
        Ответить
        • Если не знат, так хуле ошибку не выдает?
          Ответить
          • потому что + работает с интами - MyClass кастится в инт неявно - все норм. результат инт - неявно кастится в лонг - все норм
            Ответить
            • Но кресты-то выдают сообщение о неоднозначной перегрузке плюса. У них находится как минимум четыре кандидата: int+int, long+int, int+long, long+long. А шарпик молча выбирает int+int.
              Ответить
              • в шарпе 2 варианта int+int и long+long

                инт предпочтительней, это нужно знать
                Ответить
        • wh0cd4861542 <a href=http://costofviagra2017.com/>cost of viagra</a>
          Ответить
      • блядская неявность. Сначала все неявно кастится в инт, а потом результат неявно кастится в лонг. implicit - зло
        Ответить
        • После этого хочется писать в таком стиле:
          long y = (long)((long)2 * (long)x - (long)3)*(long)x + (long)5;

          Чтобы уж наверняка.
          Ответить
          • достаточно long k = (long)new MyClass()+new MyClass();
            Ответить
            • И с плавпитухом тоже нормально:
              https://ideone.com/cV2tT2

              https://ideone.com/PPjziK

              Если пнуть, то он и float+float, и double+double выдаёт.
              Ответить
              • еще фокус

                https://ideone.com/8iRyyl
                Ответить
                • А с тремя слагаемыми? Хочется посмотреть более тонкие эффекты.
                  (float)x() + x() + x() // питушение в float всех?
                  x() + (float)x() + x() // питушение в float всех?
                  x() + x() + (float)x() // питушение в float только последнего?
                  Ответить
                  • Так и будет: https://ideone.com/JjeWLy

                    Вычисление слева направо в типе наименьшего диапазона.

                    В третьем выражении первые два слагаемых будут интами и только для добавления «плавающего» слагаемого их сумма переведётся во float.
                    Ответить
                • Значит, про поиск типа, начиная с наименьшего диапазона, я угадал.
                  Ответить
      • Подозреваю, что тут так же, как и в Си, и в Паскале: сначала вычисляется выражение. Его тип выводится как тип, имеющий минимальный диапазон (сначала короткие инты, потом средние, потом длинные, потом плавающие питухи и т. п.), а уже потом вычисленное выражение (какого бы типа оно ни было) приводится к типу левой части.

        Например, в перечисленных языках при сложении двух интов легко поймать переполнение (даже если в левой части «длинный» тип), если не вставить у одного из слагаемых явный каст в длинный инт.

        И тут, как я понял, перебор начинается с типов минимально возможного диапазона. Можно уложиться в инт — считаем в инте, и только оператор присвоения будет приводить результат к лонгу.
        Ответить
        • wh0cd3894591 <a href=http://cheapviagra2017.com/>cheap viagra</a>
          Ответить
    • http://ideone.com/MOLqkH
      А вот заботливые кресты спасают программиста от неоднозначностей. Какой юзер-френдли язык!
      Ответить
    • public static implicit operator long

      Штоэта?
      Ответить
      • Это про программирование, тебе не понять

        забей в общем
        Ответить
      • > public static implicit operator long
        > Штоэта?

        "long operator" это программерский слэнг для пениса. остальное сам догадаешься (например "public" это таг для эксгибиционизма).
        Ответить
        • и так, си шарп заиграл новыми красками...
          Ответить
          • А в сишке/крестах можно написать long long.
            Ответить
            • public static long DoSmth(Man man, Woman woman)
              Ответить
              • Нет, речь идёт о таких типах:
                signed long long int
                unsigned long long int
                long double

                В сишке можно добавить long к некоторым имеющимся типам, включая long (int).

                Кстати, а long long long int и long long double бывают?
                Ответить
    • Кстати, без implicit надо будет писать явный каст?
      Ответить
      • Если вместо implicit написать explicit, то нужно будет писать

        (long) new MyClass()

        Иначе пошлет из-за несовместимости типов
        Ответить
        • А по-умолчанию explicit или implicit?
          Ответить
          • нет умолчания, пишешь либо то, либо то, иначе просто не скомпилится
            Ответить
            • Нахуй так жить.
              Ответить
              • Костыли, костыли...

                Я бы просто слово explicit выкинул
                Ответить
                • А implicit конструкторы у вас бывают?
                  Ответить
                  • implicit используется исключительно в приведении типа

                    А конструкторы бывают статичными
                    Ответить
                    • Просто кресты умеют юзать конструкторы для приведения типа. Потому и спросил.
                      Ответить

    Добавить комментарий