вопрос про 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 шт):

Автор решения: Harry

Посмотрите внимательно, что происходит при ch, равном 'e'.

Без else вы сначала присваиваете переменной e значение 1, а потом во втором блоке if в части else вы эту переменную обнуляете...

При наличии else до второго if выполнение не доходит...

P.S. Кстати, ваш цикл можно переписать короче:

while ((ch = getchar()) != '#')
{
    count += (ch=='i' && e);
    e = (ch == 'e');
}
→ Ссылка