вопрос про if в си
Изучаю сейчас си по одной книжке. Натолкнулся на такое задание: Напишите программу, которая читает входные данные, пока не встретит символ #, и сообщает количество вхождений последовательности ei.
Вот мое решение:
#include <stdio.h>
int main(void)
{
char ch;
int count = 0, e = 0;
while ((ch = getchar()), ch != '#') {
if (ch == 'e') {
e = 1;
}
if (ch == 'i' && e) {
count++;
e = 0;
}
else
e = 0;
}
printf("\n%d", count);
return 0;
}
Оно не считает вхождение ei. Но если добавить вместо второго if
-> else if
, то все прекрасно работает:
#include <stdio.h>
int main(void)
{
char ch;
int count = 0, e = 0;
while ((ch = getchar()), ch != '#') {
if (ch == 'e') {
e = 1;
}
else if (ch == 'i' && e) {
count++;
e = 0;
}
else
e = 0;
}
printf("\n%d", count);
return 0;
}
Можете объяснить, почему так происходит? Вроде решения идентичны, так как в моем решении управление после первого if переходит ко второму, а в чужом после if к else if
Ответы (1 шт):
Посмотрите внимательно, что происходит при ch
, равном 'e'
.
Без else
вы сначала присваиваете переменной e
значение 1, а потом во втором блоке if
в части else
вы эту переменную обнуляете...
При наличии else
до второго if
выполнение не доходит...
P.S. Кстати, ваш цикл можно переписать короче:
while ((ch = getchar()) != '#')
{
count += (ch=='i' && e);
e = (ch == 'e');
}