Использование for-l oop in C для проверки возвращаемого значения функции - PullRequest
0 голосов
/ 06 февраля 2020

Я довольно новичок в кодировании и особенно в C, поэтому я решил взять курс CS50 как введение в язык. Я только что закончил просмотр первой лекции по C и, чтобы проверить свои знания по этому предмету, я попытался написать небольшую небольшую программу. Также я использую библиотеку курса для функции get_int().

Цель состоит в том, чтобы проверить вводимые пользователем данные и проверить, меньше ли оно или равно десяти. Если он соответствует параметрам, программа должна вывести «Success!» сообщение и выход; в противном случае он должен запросить ввод еще раз. Если входное значение больше 10, программа отвечает так, как и ожидалось, но если вы введете значение 10 или меньше, в конечном итоге она запрашивает у вас ввод еще один раз перед фактическим выходом. Я думаю, что это, вероятно, что-то с "для" l oop, но я просто не могу понять это.

Мой код:

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>

int check_for_value();

int main()
{
    for(check_for_value(); check_for_value() != 1;  check_for_value())
    {
        printf("Failed!\n");
    }
    exit(0);
}

int check_for_value()
{
    int i = get_int("Your value: \n");

    if(i <= 10)
    {
        printf("Success!\n");
        return 1;
    }    
    else
    {
        printf("Try again!\n");
        return 0;
    }
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Это не совсем то, что вы думаете. В вашем for l oop каждый раз, когда вы пишете check_for_value (), он будет вызывать эту функцию. Поэтому он будет вызывать его в первый раз, и возвращаемое значение не будет иметь значения. Он будет вызывать его снова для оператора middle, и тогда значение будет иметь значение, потому что вы сравниваете результат с не равным 1. И затем он снова вызовет функцию в третьем операторе, где снова это не будет иметь значения. Обычно для чего-то подобного вы используете вместо этого время l oop. Пример ниже:

int ret = check_for_value();
while(ret != 1) {
    printf("Failed\n");
    ret = check_for_value();
}

printf("Success\n");

Технически a для l oop может также работать следующим образом:

for(int ret = check_for_value(); ret != 1; ret = check_for_value()) {
    printf("Failed\n");
}
0 голосов
/ 06 февраля 2020

для l oop может выглядеть очень просто

for ( ; !check_for_value(); )
{
    printf("Failed!\n");
}

В таком случае лучше использовать while l oop

while ( !check_for_value() )
{
    printf("Failed!\n");
}

Что касается вашего для l oop

for(check_for_value(); check_for_value() != 1;  check_for_value())
    ^^^^^^^^^^^^^^^^^                           ^^^^^^^^^^^^^^^^^

, то подчеркнутые вызовы функции не проверяются.

Также имейте в виду, что такое определение для l oop

for(int ret = check_for_value(); ret != 1; ret = check_for_value()) {
    printf("Failed\n");
} 

- очень плохой стиль программирования. Есть избыточные записи вызовов функций. Промежуточная переменная ret не используется в теле l oop. Так что его декларация также избыточна. Никогда не используйте такой стиль программирования.

Обратите внимание, что согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

и оператор

exit( 0 );

является избыточным.

...