Кресты / Говнокод #13638 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
#include <iostream>

using std::cout;
using std::endl;

auto power(double x, int n)-> double*;

int main()
{
	void * c = power(5,2);

	std::cout << *(double*)c << std::endl;

	return 0;
}

auto power(double x, int n)-> double* 
{ 
	double* result(new double(1.0));
	for(int i = 1; i <= n; i++)
	*result *= x;
	return result;
}

Запостил: taburetka taburetka, (Updated )

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

    • Я не кэп, рад бы был помочь, но, увы, не знаю в чем тут дело - самому интресно

      Сделаю пару предположений
      1. Auto
      Auto - аналог шарповского Var - никогда не видел в контексте объявления функций - ну да я с плюсами почти не работал, может все норм.
      2. void * c = power(5,2);
      Таки почему ссылка на void, а потом конвертация в double?
      Ответить
      • >Auto - аналог шарповского Var - никогда не видел в контексте объявления функций
        Таки используется для объявления возвращаемого типа. В основном в шаблонных функциях если возвращаемый тип зависит от типов параметров
        Ответить
    • > Таки почему ссылка на void, а потом конвертация в double?
      1. Какого хрена вообще double*, а не просто double.
      2. Функция возвращает double*, зачем его туда-сюда кастовать через void * - непонятно.
      3. Тип результата не зависит от типа аргументов, declspec не юзается - авто не нужно.
      4. Утечка памяти, выделенной в строке 19.
      5. Неэффективный алгоритм возведения в степень, имеющий сложность О(n).
      6. Нет отступа в строке 21.

      Достаточно? 🙂
      Ответить
      • >Неэффективный алгоритм возведения в степень, имеющий сложность О(n).

        А как выглядит эффективный?

        что то такое?
        while (pow>1)
                    {
                        x = (x*x) * (x*(pow%2));
                        pow /= 2;
                    }


        Это так, навскидку
        Ответить
        • Тип того.
          while (pow > 0) {
              if (pow % 2) // if (pow & 1)
                  result *= x;
              pow /= 2; // pow >>= 1;
              x *= x;
          }
          > Блин, пишу бред, а удалить нельзя)
          Да почему бред, почти попал же 😉
          Ответить
          • Рекурсивно на шарпике (хотя рекурсия не желательна, я знаю)
            int InPow(int x, int pow)
                    {
                        return (pow == 1) ? x : InPow(x*x, pow>>1)*((pow&1)==0?1:x);
                    }
            Ответить
              • да, повиснет. ибо я писал с расчетом pow=>1

                фикс

                int InPow(int x, int pow)
                {
                return (pow == 0) ? 1 : InPow(x * x, pow >> 1) * ((pow & 1) == 0 ? 1 : x);
                }
                Ответить
                • Хвостовая рекурсия (есть вероятность, что компилятор оптимизнет ее в цикл):
                  int InPow2(int x, int pow, int result) {
                      return pow == 0 ? result : InPow(x * x, pow >> 1, result * ((pow & 1) == 0 ? 1 : x));
                  }
                  int InPow(int x, int pow) {
                      return InPow2(x, pow, 1);
                  }
                  Ответить
      • Это какое-то синтетическое говно, почему его плюсуют?
        Оно даже на лабу не тянет.
        Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8