Что лучше: написать те же строки кода или вызвать одну и ту же функцию? - PullRequest
1 голос
/ 28 мая 2020

Это правда, что написание тех же строк кода - плохое программирование, и этот подход был бы лучше, но приводит ли это к каким-либо проблемам? будут ли созданные переменные все еще существовать, так что я трачу память?

Что на самом деле происходит, когда я вызываю foo ()?

#include <stdio.h>

int foo(){
    printf("\nSelect operation. 1 to add, 2 to remove, 3 to exit.");
    printf("\n> ");
    unsigned int choice;
    scanf("%d",&choice);
    while (choice!=3){
        if (choice==1){
            // stuff
        } else if (choice==2){
            // stuff
        } else {
            printf("\nError, try again..\n");
            foo();          // what happens? does this bring to problems of any kind? will the variables created still exist, so am I wasting memory?
        }
    }
    printf("\nEnd of run.\n");
}

или

#include <stdio.h>

int foo(){
    printf("\nSelect operation. 1 to add, 2 to remove, 3 to exit.");
    printf("\n> ");
    unsigned int choice;
    scanf("%d",&choice);
    while (choice!=3){
        if (choice==1){
            // stuff
        } else if (choice==2){
            // stuff
        } else {
            printf("\nError, try again..\n");
            printf("\nSelect operation. 1 to add, 2 to remove, 3 to exit.");
            printf("\n> ");
            scanf("%d",&choice);
        }
    }
    printf("\nEnd of run.\n");
}

Какой подход лучше? Я также читал, что, например, вызов main () - плохое программирование.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Я предполагаю, что l oop должен работать, пока пользователь не введет «3». Основная проблема, похоже, заключается в том, что вы хотите, чтобы использование было напечатано один раз в начале, а затем снова для каждого недопустимого ввода. Один из способов сделать это, не меняя слишком много кода, мог бы быть таким:

#include <stdio.h>

void print_usage(void){
    printf("\nSelect operation. 1 to add, 2 to remove, 3 to exit.");
    printf("\n> ");
}

int foo(){
    print_usage();
    unsigned int choice;

    do {
        scanf("%d",&choice);

        if (choice==1){
            // stuff
        } else if (choice==2){
            // stuff
        } else if(choice!=3){
            printf("\nError, try again..\n");
            print_usage();
        }
    } while (choice!=3);

    printf("\nEnd of run.\n");
}

Делая это так, scanf() будет выполняться на каждой итерации (чтобы пользователь мог ввести ' 1 или 2 так часто, как им нравится), и проблема с дублированным кодом решается путем помещения этой части в небольшую отдельную функцию.

Обратите внимание, что этот код на самом деле не ведет себя одинаково Кстати как в любой из ваших версий. Это работает так, как я думаю, вы, вероятно, захотите, чтобы он работал.

0 голосов
/ 28 мая 2020

Если ваш вызов foo() является последним оператором (в вашем примере это не так, поскольку есть другой вызов printf, но я полагаю, что это только для отладки), это называется "хвостовой вызов" , который может быть оптимизирован вашим компилятором:
С этой оптимизацией вы не теряете стек, поскольку вызов фактически заменяется прыжком.

Лично я немного осторожно полагаюсь на оптимизацию компилятора , так что вам, вероятно, go лучше использовать здесь al oop. YMMV.

Edit: я наблюдал, что вызов на самом деле находится в самом al oop, я думаю, вы хотели заменить l oop вызовом. Но, возможно, я изначально неправильно понял вашу идею.

...