1. Си / Говнокод #23224

    0

    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
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    #include <stdio.h>
    
    typedef int (*FUNC)();
    
    FUNC test (int a, int b){
        int ret(){
            return a + b;
        }
    
        return ret;
    }
    
    int main(){
        printf("%i\n", test(40, 2)());
        return 0;
    }
    
    
    /* Тоже самое на JS */
    function test(a, b){
        function ret(){
            return a + b;
        }
    
        return ret;
    }
    
    alert(test(40, 2)());
    
    
    # Тоже самое на Python
    def test(a, b):
        def ret():
            return a + b
    
        return ret
    
    print test(40, 2)()

    Странно работает компилятор, версия: gcc version 4.7.2

    $ gcc 1.c && ./a.out
    42
    $ gcc -O3 1.c && ./a.out
    Segmentation fault

    Запостил: j1392184, 28 Июля 2017

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

    • LOL)

      Похоже на "ya perepesala"
      Ответить
    • typedef int (*FUNC)();

      Что за уебанский синтаксис?
      Ответить
    • Эти gcc'шные "лямбды" нельзя возвращать. Они живут только до конца функции.
      Ответить
    • Breaking news, в сишку не завезли замыкания.
      Ответить
      • http://govnokod.ru/21932 - https://gist.github.com/iamtakingiteasy/c80112437ebc1f8d73eecf8df27caa24
        Ответить
      • Кстати, а чем замыкания отличаются от каррирования и частичной специализации
        Ответить
      • O nyet! В С++ тоже не работает!
        https://wandbox.org/permlink/2JdEM4yb4b1cILJr
        #include <iostream>
        
        auto test(int a, int b) {
            return [&]() { return a + b; };
        }
        
        int main() {
            std::cout << test(40, 2)() << '\n';
        }
        Ответить
        • C -O0 прекрасно работает.
          Ответить
          • Я все починил
            https://wandbox.org/permlink/rz1tpk1NXTMrEVrt

            Clang:
            -O0 4200214
            -O1 4201616
            -O2 0
            -O3 0

            GCC (просто шикарно):
            -O0 13
            -O1 42
            -O2 42
            -O3 42
            Ответить
            • Определение версии и флагов компилятора в рантайме.

              Осталось доработать до constexpr, чтобы можно было определять и в компайлтайме.
              Ответить
              • > определять и в компайлтайме
                Компайлтайм UB'ы - это сильно.
                Ответить
    • https://wandbox.org/permlink/64rHJ61XH4h2zTI3

      #include <stdio.h>
      
      int main(){
          typedef int (*FUNC)();
          auto FUNC test (int, int);
          
          
          printf("%i\n", test(40, 2)());
          return 0;
          
          
          
          auto FUNC test (int a, int b){
              int ret(){
                  return a + b;
              }
      
              return ret;
          }
      }
      Ответить
    • Читай книги малыш ты нихуя не шаришь
      Ответить
      • Книги-хуиги. Царям они не нужны. Всё постигается методом проб и ошибок.
        Ответить

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