是编写相同的代码行更好,还是回忆相同的功能更好?

Is it better to write the same lines of code, or to recall the same function?

确实,编写相同的代码行不是好的编程,而且这种方法会更好,但这会带来任何类型的问题吗?创建的变量还会存在吗,我是不是在浪费内存?

当我回忆起 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() 不是好的编程。

如果您对 foo() 的调用是最后一条语句(在您的示例中它不是,因为还有另一个对 printf 的调用,但我认为这仅用于调试)这称为a "tail-call",可能会被你的编译器优化:
有了这个优化,您就不会浪费堆栈,因为调用实际上被跳转代替了。

就我个人而言,我对依赖编译器优化有点谨慎,因此您最好在此处使用循环。 YMMV.

编辑:我发现调用实际上是在一个循环中,我猜你是想用调用替换循环。但也许我一开始就误解了你的想法。

我假设循环应该 运行 直到用户输入“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'),重复代码的问题是解决办法是将该部分放入一个小的单独函数中。

请注意,此代码实际上与您的任何一个版本的行为方式都不相同。它的工作方式就像我猜你可能希望它工作一样。