Простой для цикла внезапно завершает работу программа на C

#c #loops #modulo

Вопрос:

Я использую MSVC через

 cl file.c
 

с помощью этого очень простого кода:

 #include <stdio.h>
#include <stdlib.h>
    
int
main(void) {
    
    int num = 50, pointNum = 60, max = 0;
    
    puts("Hello");

    for (int i = 0; i <= num; i  ) {
        printf("%dn", pointNum % i);
    }

    return 0;
}
 

но когда я запускаю его из командной строки, он просто останавливается, а затем вылетает, печатая только «Привет». Я понятия не имею, что не так, потому что это кажется безошибочным.

Комментарии:

1. Не могли бы вы описать, почему вы считаете, что он падает? Выводит ли он какой-нибудь текст на экран? Если да, не могли бы вы поделиться этим текстом?

2. @BillLynch Я не знаю, почему он вылетает. Он печатает только «Привет» (оператор put), но останавливается в цикле, а затем завершает работу.

3. Верно, он ничего не печатает? Выводит ли он строку «ошибка сегментации»? Печатает ли он строку «Привет, я разбился!»?

4. @BillLynch Он не напечатал ошибку сегментации строк, вероятно, потому, что я просто использую Notepad и командную строку. Так что я понятия не имел.

5. вы начинаете цикл с i равным 0 , а затем первое, что вы делаете в цикле, — это деление на i … итак, вы делите на ноль… это не так безошибочно.

Ответ №1:

Когда i == 0 вы выполняете математику 60 % 0 , которая запускает деление на ноль. Это вызывает неопределенное поведение, которое часто приводит к сбою вашей программы.

Комментарии:

1. Это вызывает неопределенное поведение — возможен и любой другой результат

Ответ №2:

На самой первой итерации цикла делитель равен 0. Но деление на 0 невозможно. Таким образом, он просто выходит из строя. Вместо этого фрагмента кода, я думаю, вам следует использовать

 for (int i = 1; i <= num; i  ) {
    printf("%dn", pointNum % i);
}
 

Это не приведет к какой-либо ошибке.