gpt4 book ai didi

c - 使用 goto 语句的替代方法

转载 作者:太空狗 更新时间:2023-10-29 15:57:47 24 4
gpt4 key购买 nike

我对编写一个从用户那里获取“/”字符并警告用户不要在分子中使用 0 的程序感到困惑。我已经构建了程序,但我想要使用 goto 语句的替代方法。

# include <stdio.h>
int main()
{
char o;
int num1,num2;
printf("Enter one operator like '+' '-' '/' '%%' '*' : ");
scanf("%c",&o);
printf("Enter 1st number: ");
scanf("%d",&num1);
my: printf("Enter 2nd number: ");
scanf("%d",&num2);

下面我想删除这两行,但它应该能达到与工作时相同的结果。

    if(o=='/' && num2==0 ){
printf("You can't divide by zero \n");
goto my;
}
switch(o) {
case '+':
printf("%d + %d = %d",num1, num2, num1+num2);
break;
case '-':
printf("%d - %d = %d",num1, num2, num1-num2);
break;
case '*':
printf("%d * %d = %d",num1, num2, num1*num2);
break;
case '/':
printf("%d / %d = %d",num1, num2, num1/num2);
break;
case '%':
printf("%d %% %d = %d",num1, num2, num1%num2);
break;
default:
printf("Operator is not correct");
break;
}
printf("\n\n");
system ("pause");
}

最佳答案

There is nothing wrong with goto in and of itself!

这是大多数人无法理解的地方,而是简单地重复几十年前发表的一篇论文中选得不好的片段,Dijkstra 本人后来对此感到后悔,他说了一些类似“人们正在制造的不良感觉”的内容一种宗教”。

如果人们只是想理解指导方针背后的原因,比如使用goto , breakcontinue ,或限制函数的退出点等,他们将成为更好的艺术实践者。

Dijkstra 实际上 反对的,也是我全心全意同意的,是在一个几乎没有其他方面的计算环境中“肆无忌惮地使用 go to 语句”迭代。事实上,许多环境只有goto可能会导致大量的意大利面条代码,很难理解。

我实际上认为行业中的盲目教条主义远比 goto 更严重。语句曾经是 :-) goto 的问题是它的误用,因为,如前所述,它会使代码更难理解,当我听到这些声明时,我倾向于做的是问:

Is this code hard to follow or maintain because it breaks the "rules"?

如果您要按如下方式重组代码:

// ===================================================
// Get the second number, disallowing zero if dividing.
getSecondNum:
printf ("Enter 2nd number: ");
scanf ("%d", &num2);
if ((o == '/') && (num2 == 0)) {
printf ("You can't divide by zero \n");
goto getSecondNum;
}
// ===================================================

你会很难想出一个 dowhile基于解决方案,可读或可理解。您可能 匹配 可读性,但您经常会发现在零个或多个 do 之间选择不当和一个或多个 while可以使代码不那么可读。

就其值(value)而言,这与我在非 goto 中获得的相同代码差不多。 -使用方式:

// ===================================================
// Get the second number, disallowing zero if dividing.
do {
printf ("Enter 2nd number: ");
scanf ("%d", &num2);
if ((o == '/') && (num2 == 0)) {
printf ("You can't divide by zero \n");
} while ((o == '/') && (num2 == 0));
// ===================================================

但这还有其他问题,例如代码重复。这也可以解决,但通常涉及使用更多变量,或使用 breakgoto完全相同的问题这里(b)


所以,最重要的是,不要把你不理解的东西当成福音,不管它是来自 Dijkstra、Knuth、dkr,还是你可能想到的任何其他神灵相信:-)

首先考虑为什么它可能被认为是福音,然后这就是您如何决定它是否适用于特定情况(a) .

经常使用goto在状态机、错误处理等方面,它实际上简化了原本难以理解的代码。


(a) 这包括来自网络上随机人员的建议,甚至来自那些所谓的“paxdiablo”:-)


(b)可能要考虑的一件事是让用户输入零,即使是除法,然后在计算中用一些东西将其排序喜欢:

case '/':
if (num2 == 0)
printf ("%d / 0 is undefined, cannot divide by zero", num1);
else
printf ("%d / %d = %d", num1, num2, num1 / num2);
break;

我自己可能更喜欢提前捕获选项,但这可能对您来说是一个可行的解决方案。

关于c - 使用 goto 语句的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com