- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对编写一个从用户那里获取“/”字符并警告用户不要在分子中使用 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
, break
和 continue
,或限制函数的退出点等,他们将成为更好的艺术实践者。
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;
}
// ===================================================
你会很难想出一个 do
或 while
基于解决方案,更可读或可理解。您可能 匹配 可读性,但您经常会发现在零个或多个 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));
// ===================================================
但这还有其他问题,例如代码重复。这也可以解决,但通常涉及使用更多变量,或使用 break
与 goto
有完全相同的问题这里(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/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!