【发布时间】:2023-03-24 12:15:01
【问题描述】:
我最近遇到了一个编程问题,在我看来解决它的最优化方法是使用 goto,尽管这不是一个好习惯。问题是:告诉用户输入一个正自然数(> 0)并读取输入。如果这个数字是有效的,告诉用户那个数字的平方。在输入正确的情况下执行此操作。我想出了一些解决方案,但似乎都有问题。以下是其中两个:
解决方案 1 - 问题:使用 goto
#include <stdio.h>
int main()
{
int num;
_LOOP:
printf("Enter a positive natural number: ");
scanf("%i", &num);
if (num > 0) {
printf("Square: %i\n", num * num);
goto _LOOP;
}
printf("Invalid number\n");
return 0;
}
解决方案 2 - 问题:仔细检查 num > 0(代码重复)
#include <stdio.h>
int main()
{
int num;
do {
printf("Enter a positive natural number: ");
scanf("%i", &num);
if (num > 0)
printf("Square: %i\n", num * num);
} while (num > 0);
printf("Invalid number\n");
return 0;
}
显然,有更多的方法可以解决这个问题,但我想出的所有其他方法都没有使用 goto 遇到相同的代码重复问题。那么,是否有一种解决方案可以避免 goto 和代码重复?如果没有,我应该去哪一个?
【问题讨论】:
-
您可能对
continue和break语句感兴趣。 -
我不愿意发布一个实际的答案,但是......在
scanf调用之后带有if (num <= 0) break;的“无限”while(1) { ... }循环可以解决问题。这是 C 和 C++ 中相当常见的“范式”。 -
仍然有一个条件循环 - while(true) - 检查其中的另一个条件 - if (num
-
@rdbo 没有条件。编译器会将其替换为无条件分支指令。
-
@EugeneSh。哦,我明白你在说什么。因为循环总是分支,编译器会确保程序甚至不会检查条件,因此达到与 goto 相同的结果并同时避免它