Блог пользователя YuRNeRo_KZ

Автор YuRNeRo_KZ, 14 лет назад, По-русски
Как-то раз решая ету - задачу  столкнулся с вот такой проблемой :
Я написал своё решение и хотел её проверить только на Dev C++  и  Microsoft Visual  Studio 2010
выходят разные ответы. Вот exe файл от Visual и exe файл от Dev c++.
Вот input : 911
Должно быть
output :
9 2
1 1
YES
Объясните пожалуйста почему так?
  • Проголосовать: нравится
  • -1
  • Проголосовать: не нравится

14 лет назад, # |
Rev. 3   Проголосовать: нравится +15 Проголосовать: не нравится
Ты забыл написать return;

    if (tp>9) go(tp); else return tp;

На надо
    if (tp>9) return go(tp); else return tp;

А когда исполнение доходит до конца не-void функции, даже компилятор не знает, что она вернет.

Кстати, у меня на такие ошибки g++ выдает warning'и. Настоятельно рекомендую их читать.
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Вот только иногда g++ не в силах определить, возвращается ли значение у функции или нет. Тогда по умолчанию он не выдаёт предупреждений.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      А можно пример, когда "g++ не в силах определить, возвращается ли значение у функции или нет" ?
      • 14 лет назад, # ^ |
          Проголосовать: нравится +7 Проголосовать: не нравится
        Функция вычисления факториала. Рекурсивная.



        int fact(int x)
        {
                if (x > 0)
                        return x * fact(x - 1);
                if (x == 0)
                        return 1;
        }

        int main()
        {
                cout << fact(-1);
        }

        g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
        Предупреждения не выдаёт даже с -Wall. Ну не умеет обрабатывать компилятор рекурсию.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Я не пользуюсь g++, но любопытно.
          Непонятно, какое отношение рекурсия имеет к предупреждению. Компилятор же здесь не на алгоритм должен опираться, а на завершение функции при отсутствии return (borland, например, предупреждает).
          А что, если  

          int fact(int x)
          {
                  if (x > 0)
                          return 0;
                  if (x == 0)
                          return 1;
          }

          то предупреждает?
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Действительно интересно. На втором примере выдаёт.
            На всякий случай перепроверил с MinGW'шным компилятором - тоже на первом варианте не выдаёт warning.
            Хотя вы, конечно, правы: по логике вещей тут рекурсия никак не влияет на завершение функции.
            • 14 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
              Только что проверил на MinGW первый вариант. Получил warning : control reaches end of non-void function.
              Windows XP 32 бит. MinGW 4.4.1

              ИМХО рекурсия не причем.
              Просто компилятор идет по всем операторам ветвления и смотрит что везде доходит до какого-нибудь return;
            • 14 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              g++ версии 4.2.1 в составе Mac OS X выдает предупреждение в обоих случаях, если включить -Wall.

              А по-моему логично, что компилятор не выдает предупреждения в рекурсивном варианте. Ведь для того, чтобы определить, что произвольная рекурсивная функция доходит или не доходит до определенной точки выполнения, нужно решить Halting problem, чего компилятор сделать не может.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Понятно, что он не может проверить, заканчивается ли ветка рекурсии.
                Но заметить очевидную ветку (x < 0), в которой ничего не возвращается и никакая рекурсия не вызывается он должен.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  Так в том-то и дело, что проверить, вызывается ли когда-либо это функция с отрицательным аргументом, не так просто. Хотя у вас компилятор действительно какой-то странный, он не должен обращать внимание на рекурсию.
                  • 14 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Когда тремя строками ниже стоит вызов fact(-1), это, казалось бы, прямой намёк компилятору.

                    Если уж g++ странный, то кто же нормальный...
                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      Это вам очевидно, а компилятору вряд ли. Про g++ повторю: вы здесь единственный, у кого g++ не ругается на этот код :)
                      • 14 лет назад, # ^ |
                        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
                        Хорошо, прекратим спорить.
                        Интересно, а что будет ещё через два поста в этой ветке?
                    • 14 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      Я слышал, сам не знаю, что самый крутой - это Intel C++. Но у него нет бесплатной версии.
14 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
Спасибо