是编写相同的代码行更好,还是回忆相同的功能更好?
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'),重复代码的问题是解决办法是将该部分放入一个小的单独函数中。
请注意,此代码实际上与您的任何一个版本的行为方式都不相同。它的工作方式就像我猜你可能希望它工作一样。
确实,编写相同的代码行不是好的编程,而且这种方法会更好,但这会带来任何类型的问题吗?创建的变量还会存在吗,我是不是在浪费内存?
当我回忆起 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'),重复代码的问题是解决办法是将该部分放入一个小的单独函数中。
请注意,此代码实际上与您的任何一个版本的行为方式都不相同。它的工作方式就像我猜你可能希望它工作一样。