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

    +139

    1. 1
    for (normalize(); n > 0; scanf("%d", &temp, n--)){...}

    Но ведь работает!

    Запостил: Nex, 30 Сентября 2013

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

    • А чем это лучше for (normalize(); n > 0; scanf("%d", &temp), n--){...} ?
      Ответить
      • Наличием ворнинга.
        Ответить
      • Возможно вы имели в виду "а чем это лучше
        normalize();
        while (n > 0) {
            // ... то что было в скобках ...
            scanf("%d", &tmp);
            --n;
        }
        // или
        for (; n > 0; --n) {
            // ... то что было в скобках ...
            scanf("%d", &tmp);
        }
        "? :)
        Ответить
        • фу, какой анскилльный питушиный код
          Ответить
        • Это всё синтаксический сахар. А версия от автора будет падать, если scanf окажется stdcall, a main -- omit-frame-pointer.
          Ответить
          • > если scanf окажется stdcall
            Каким хреном? :) stdcall не умеет в переменное число аргументов...
            Ответить
            • Блин, и правда, тупые компиляторы не умеют генерировать stdcall для функций с переменным числом аргументов.
              Но я готов поклясться, что где-то читал, что va_end() как раз нужен для того, чтобы stdcall-подобные соглашения о вызове могли правильно чистить стек для функций с переменным числом аргументов.
              Ответить
              • > stdcall для функций с переменным числом аргументов
                А как? Обязать функцию просканить все дополнительные параметры, чтобы va_end смог законфигурить разгрузку стека на возврате?

                На ящике с динамитом сидеть конечно можно, но не нужно ;)
                Ответить
                • >А как? Обязать функцию просканить все дополнительные параметры, чтобы va_end мог правильно размотать стек?
                  Именно так :)
                  Ответить
                  • Ну или передать неявным аргументом количество дополнительных аргументов.

                    P.S. На самом деле можно придумать и такое соглашение, но это никому не нужно ;)
                    Ответить
                    • Это уже по-питушиному и анскильно.
                      [size=1]я всё правильно назвал?[/size]
                      Ну и где мой бб-код? :(
                      Ответить
                      • > [size=1]я всё правильно назвал?[/size]
                        > Ну и где мой бб-код? :(
                        вот здесь: я всё правильно назвал?
                        Ответить
      • Твой вариант лучше, т. к. в стек не помещаются лишние аргументы.
        А ещё, он понятнее.
        Ответить
      • продолжим извращаться :

        for (normalize(); n > 0; scanf("%d", &temp), n--){...}


        дальше:

        for (normalize(); n > 0;  n--){
        scanf("%d", &temp);
        }
        Ответить
        • normalize() можно вынести вперед, тогда получится, то что я уже видел выше.
          Ответить
        • n-- это анскилльная питушня, настоящий Сишник напишет --n, ибо оно работает быстрее.
          Ответить
          • мммм, я этого не знал (не настоящий сишник).
            Ответить
    • Кстати, можно соптимизировать:
      for (normalize(); n > 0; scanf("%d", &temp, --n)){...}
      Ответить
      • Без посимвольного сравнения и не сразу узреешь всю соль Вашего комментария.
        Ответить
      • И убрать ворнинг
        for (normalize(); n > 0; scanf("%d", (--n, &temp))){...}
        Ответить

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