#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);
}
Это не приведет к какой-либо ошибке.