вопрос программирования c - PullRequest
0 голосов
/ 23 апреля 2011

все. Я не уверен, уместно ли задавать такой «простой» вопрос здесь, но на самом деле мне сложно: [, а вот вопрос и немного кода на c:

main()
{
    int c, i;
    for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i)
        printf("%d", i);
    if (c == '\n')
        printf("%d", i);
}

После выполнения этой программы, когда я введу, скажем, «abc \ n», программа вернет:

0
1
2
3

Мне стало интересно, почему результат не

0
1
2

так как, когда c == '\ n', нет никаких утверждений, которые увеличивают i на 1. Это то, что я подумал, я должен быть неправ, не могли бы вы сказать мне, где я был не прав? Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 апреля 2011

Последовательность операций в цикле for:

i = 0
(c = getchar()) != EOF && c != '\n' // c is set to 'a'
printf("%d", i)    // displays 0

++i   // i == 1
(c = getchar()) != EOF && c != '\n' // c is set to 'b'
printf("%d", i)    // displays 1

++i   // i == 2
(c = getchar()) != EOF && c != '\n' // c is set to 'c'
printf("%d", i)    // displays 2

++i   // i == 3
(c = getchar()) != EOF && c != '\n' // c is set to '\n'
// the loop exits

Таким образом, printf() после цикла for выводит самое последнее значение для i, которое равно 3.

0 голосов
/ 11 марта 2015

Основная проблема заключается в предварительном увеличении индексной переменной i.Вместо предварительного увеличения используйте постинкремент, т.е. i ++ внутри цикла for. Причина этого заключается в предварительном увеличении.Когда условие внутри цикла останавливается, значение, сохраненное в i, уже равно 4, если вы используете предварительное увеличение.

main()
{
    int c, i;
    for (i = 0; (c = getchar()) != EOF && c != '\n'; i++)
        printf("%d", i);
    if (c == '\n')
        printf("%d", i);
}
0 голосов
/ 23 апреля 2011

++i исполняется после случая c == '\n'.

Возможно, этот код поможет уточнить?

int i;
for (i = 0; i <= 3; ++i)
    printf("%d\n", i);

В конце цикла я буду 4 из-за этого последнего приращения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...