C++ программа падает, когда счетчик используется внутри цикла

Я работаю над очень маленькой программой, чтобы найти делители целого числа в C++. Мой основной метод в значительной степени помещает int в var и вызывает фактор-фактор с аргументом int. Вот код:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        if((num % x) == 0)
        {
            cout << x << " ";
        }
    }
}

Программа всегда вылетает внутри фактора (). Если я использую этот код, он работает нормально:

void factor(int num)
{
    for(int x = 0; x < ((num + 2) / 2); x++)
    {
        {
            cout << x << " ";
        }
    }
}

Так что проблема где-то в if((num % x) == 0), Когда я изменяю эту строку на if((num % 2) == 0) или же if((num % 5) == 0), он дает правильные результаты (я использую 32 в качестве входных данных теста).

Я изучил C++ несколько лет назад и забыл большую часть его, после столкновения с этой проблемой я скопировал кодовое слово в слово из моего предыдущего решения этой проблемы (которое работало). Но программа все равно падает, когда я пытаюсь получить доступ к счетчику цикла.

Я использую Code::Blocks 13.12 с GCC "4.9.0 20140604 (prerelease)" в 64-разрядной версии Arch Linux.

4 ответа

Решение

Проблема в том, что у вас есть деление на ноль в вашем первом фрагменте, что является неопределенным поведением в соответствии со стандартом (n3337):

5.6p4 Мультипликативные операторы [expr.mul]

Бинарный / оператор дает частное, а двоичный % Оператор возвращает остаток от деления первого выражения на второе. Если второй операнд / или же % ноль, поведение не определено.


Так как программа не может вычислить значение такого выражения, она потерпит крах.

if((num % x) == 0)  // num % 0 on first iteration, application will crash, or order pizza
{
  cout << x << " ";
}

Как вы можете сделать num%x когда х равен 0? Из-за использования x, когда это 0, программа вылетает.

Это может вызвать ошибку во время выполнения, которая, я полагаю, будет SIGFPE,

Попробуйте начать цикл с x = 1,

Начиная с 0 не имеет никакого смысла, если вы хотите вычислить факторы числа. % Оператор вычисляет остаток от деления num/x, Деление на 0 не имеет никакого смысла, поэтому поведение операции не определено. Это означает, что он может потерпеть крах на одном компиляторе / машине и может дать какой-то результат на другом компиляторе / машине.

В самом первом цикле for x имеет значение 0. num % x потребует деления на 0, что является математическим бессмысленным значением, и именно здесь происходит сбой.

Вы хотите увидеть все делители числа (они делят число, а 0 остается перенести). Вы должны начать цикл for с 2. (1 уже дано - вы могли бы распечатать его напрямую, но у вас будет только половина числа, поэтому я подозреваю, что вас не интересует 1 и само число).

Другие вопросы по тегам