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

    +121

    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
    class Program
    {
    	static int x = 0;
    	
    	static int f()
    	{
    	x = x + 10;
    		return 1;
    	}
    	
    	public static void Main()
    	{
    		x += f();
    		System.Console.WriteLine(x);
    	}
    }

    Следите за руками! Чему же в итоге равно x?

    Проверить себя: http://ideone.com/v8rktM

    Источник: http://blogs.msdn.com/b/oldnewthing/archive/2014/08/14/10549885.aspx

    Запостил: someone, 15 Августа 2014

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

    • все правильно, 0, увеличили на 10, вернули 1, приплюсовали эту 1 к "старому" нулю
      Ответить
    • Доставил коммент:

      >C++ evaluates the function first before capturing "X".
      Or more exactly, a particular implementation of C++ on this particular source code on this particular day of the week happened to evaluate the function first.
      Ответить
    • Можно ещё код:
      x=x+f();

      Полечить перестановкой:
      x=f()+x;
      Ответить
      • Вот поэтому математикам ближе хаскель - там нет такой хуйни как некоммутативное сложение целых чисел
        Ответить
        • тут дело не в целых числах, а в побочных эффектах
          Ответить
          • Зелено - правда что ли?

            Математик не знает о побочных эффектах

            он увидит, что складываются 2 целых числа
            Ответить
            • > Математик не знает о побочных эффектах
              правда что ли?

              Расскажи это математикам, которые полвека пишут на фортране.
              Ответить
              • Если ты пишешь на фортране - ты (внезапно!) программист на фортране.
                Ответить
                • Или ты математик, который знает фортран. К.О.
                  Ответить
                • > ты (внезапно!) программист на фортране

                  Ах да, я забыл, нельзя относиться сразу к двум множествам.

                  Кегдан, сев за клавиатуру, внезапно перестал быть особью мужского пола.
                  Ответить
                  • Жажду доебаться великую в тебе вижу, падаван юнный
                    Ответить
                    • Это уже матёрый джедай.
                      Ответить
                      • А доебываеется как падаван
                        Ответить
                        • > как падаван
                          Способностью внушения джедаи обладают.
                          Ответить
                          • Стою я с братюней на въезде
                            В доспехах, винтовка со мной
                            От жажды мозги не на месте
                            Песок, Татуин - вот отстой

                            Тут едет крутая тачила
                            Какой то дедок за рулем
                            Пердун улыбается мило
                            Два дройдека, парень при нем

                            Братюна давай чин о чину -
                            "Где дройдеков, старый, украл?
                            Зачем ты, седая скотина
                            Себе гея-мальчика снял?"

                            А дед лишь рукою колышит
                            И молвит - "ну что ты, сынок
                            Не этих ты дройдоков ищешь
                            И мне ни к чему новый срок"

                            Братюня от солнца поехал -
                            "Езжай, говорит, старый хрен"
                            Парнишка трясется от смеха
                            Менты, мол, тупые совсем

                            Я мне - больше всех что ли надо
                            Все это говно разгребать?
                            Пошло б оно нахер, ребята
                            С дибилом в дозоре стоять

                            Экспресс хуерга
                            Ответить
                        • Это он тонко и издалека, чтобы не спугнуть.
                          Ответить
                  • XOR ^^
                    Ответить
        • >как некоммутативное сложение целых чисел
          Причём тут это, поехавший?
          Там нет хуйни в виде сайд-эффектов и мутабельных переменных.
          Ответить
          • Медаль гения компьютерных технологий - в студию
            Ответить
        • > математикам
          > там нет такой хуйни как некоммутативное сложение целых чисел
          Не знаю, не знаю. У математиков в хаскеле ещё некоммутативное умножение матриц и некоммутативное возведение в степень.
          Как на таком языке пишут - не знаю...
          Ответить
          • Ну так это нормально. Поле матриц не является абелевой группой по умножению.

            Все просто, берешь алгем и читаешь;)
            Ответить
            • Я бы после такой подставы от матриц числам бы не доверял (тем более, что числа - это очень маленькие матрицы).
              Ответить
              • Нет, че ты гонишь

                число - это число
                а матрица из одного элемента это

                data Matrix a = Matrix1 {getElement::a}| -- и так далее
                Ответить
                • А вот ПХП всё по-другому http://govnokod.ru/16208.
                  Но число и в математике живёт так же, как и маленькая матрица. И сложение то же, и умножение.
                  Ответить
    • Синтаксическая сахароза оказалась не такой уж легкоусваиваемой?
      А сколько слёз и боли вызывали сайд-эффекты инкрементов и присваиваний?

      PS Кто порождает шаред-статик-переменные, и не защищает их лочкой или атомиком - должен страдать.
      Ответить
      • Автор поста про то и говорит: неатомарные операции могут нагадить даже в однопоточной программе.
        Ответить
    • нехуй так писать
      такую хрень в любом языке можно сделать, результат абсолютно непредскауем
      Ответить
    • i = ++i + ++i;
      Ответить
    • а ещё в шарпе Math.Round(0.5) == 0.
      Ответить
      • Банковское округление?
        Ответить
        • Угу: http://ideone.com/zYmO5n

          Если дробная часть a находится на равном расстоянии от двух целых чисел (четного и нечетного), возвращается четное число.

          http://msdn.microsoft.com/ru-ru/library/wyk4d9cy%28v=vs.110%29.aspx
          Ответить
          • О как. Не знал такой фичи. И зачем, спрашиваетя, заморачивались? есть же старое доброе floor (x+ 0.5)
            Ответить
          • Но ведь дробная часть любого числа находится между 0 и 1. Значит, нужно всегда возвращать 0?
            Ответить
        • Eще в бейсике помню жаловались на это.
          Ответить
          • А че жаловаться? При сложении больших пачек чисел банковское округление работает лучше, чем всегда вверх.
            Ответить
            • на одной точке из бесконечного отрезка? Я вас умоляю.
              Ответить
              • > на одной точке из бесконечного отрезка
                В среднем, в среднем.

                Округление «до ближайшего чётного» исходит из предположения, что при большом числе округляемых значений, имеющих 0,5 в округляемом остатке, в среднем половина из них окажется слева, а половина — справа от ближайшего чётного, таким образом, ошибки округления взаимно погасятся. Строго говоря, предположение это верно лишь тогда, когда набор округляемых чисел обладает свойствами случайного ряда, что обычно верно в бухгалтерских приложениях, где речь идёт о ценах, суммах на счетах и так далее.
                Ответить
                • Да, с точки зрения математики это имеет смысл. Каюсь
                  Ответить
                • Но из документации на MSDN это не следует. Там вообще всё написано языком, напоминающим документацию по WCT.
                  Ответить
                  • Там написано так: Если дробная часть a находится на равном расстоянии от двух целых чисел (четного и нечетного), возвращается четное число.

                    А следствия этого факта можно найти в других местах.

                    Хотя про то, что это banker's rounding масдаевцам стоило упомянуть.
                    Ответить

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