C程序不收集计数对吗?
我之前有过一个很好的回答,但现在(尽管这是相同的练习),我有一个更具体的问题,我认为它值得自己的问答页面 这是我的程序(未完成,但编译和运行正常):C程序不收集计数对吗?,c,C,我之前有过一个很好的回答,但现在(尽管这是相同的练习),我有一个更具体的问题,我认为它值得自己的问答页面 这是我的程序(未完成,但编译和运行正常): 。。。正如你所看到的,它不是。有时计数是正确的,有时缺少一些,有时太多。知道为什么吗?我认为当你点击else state=out时,你需要立即跳出循环在while循环中。您正在消耗额外的字符 尝试更改else state=OUT到 else { state = OUT; break; } 编辑要详细说明这一工作原理,让我们评估一下
。。。正如你所看到的,它不是。有时计数是正确的,有时缺少一些,有时太多。知道为什么吗?我认为当你点击
else state=out时,你需要立即跳出循环代码>在while循环中。您正在消耗额外的字符
尝试更改else state=OUT代码>到
else {
state = OUT;
break;
}
编辑要详细说明这一工作原理,让我们评估一下这段代码:
// 1. while loop conditional
while ((c = getchar()) != EOF && state != OUT) { // get next character in word
// 2. conditional succeeded
if (c != ' ' && c != '\t' && c != '\n') // if character is not whitespace...
++length; // ...add one to length
else state = OUT; // otherwise word is over
}
while循环条件(1)是通过调用getchar然后计算state来确定的。如果此条件成功,则代码进入成功块(2)。问题是在else子句中指定state=OUT,但要求再次计算条件,这意味着您将调用getchar,然后看到state==OUT。实际上,您将跳过处理所使用的角色
短路处理条件的求值顺序。举一个简单的例子:
int foo = 0;
int bar == 1;
if (foo && bar) { ... }
由于foo
为false(0),因此无需计算bar
,因为无论其他条件如何,false值都会导致&&计算为false。同样,如果我们写道:
if (bar || foo) {...}
那么就不需要计算foo
,因为bar
是真的,并且一个真值会导致一个| |的值计算为真,而不管其余的条件如何。跳过评估其余条件的能力称为短路
在您的情况下,如果您已将while循环条件的顺序交换为
while (state != OUT && (c = getchar()) != EOF) {
然后说OUT将计算为false,这将阻止由于短路而计算c=getchar()
。如果你想知道更多的话,就在上面。希望这能有所帮助。我认为当你点击else state=out时,你需要立即跳出循环代码>在while循环中。您正在消耗额外的字符
尝试更改else state=OUT代码>到
else {
state = OUT;
break;
}
编辑要详细说明这一工作原理,让我们评估一下这段代码:
// 1. while loop conditional
while ((c = getchar()) != EOF && state != OUT) { // get next character in word
// 2. conditional succeeded
if (c != ' ' && c != '\t' && c != '\n') // if character is not whitespace...
++length; // ...add one to length
else state = OUT; // otherwise word is over
}
while循环条件(1)是通过调用getchar然后计算state来确定的。如果此条件成功,则代码进入成功块(2)。问题是在else子句中指定state=OUT,但要求再次计算条件,这意味着您将调用getchar,然后看到state==OUT。实际上,您将跳过处理所使用的角色
短路处理条件的求值顺序。举一个简单的例子:
int foo = 0;
int bar == 1;
if (foo && bar) { ... }
由于foo
为false(0),因此无需计算bar
,因为无论其他条件如何,false值都会导致&&计算为false。同样,如果我们写道:
if (bar || foo) {...}
那么就不需要计算foo
,因为bar
是真的,并且一个真值会导致一个| |的值计算为真,而不管其余的条件如何。跳过评估其余条件的能力称为短路
在您的情况下,如果您已将while循环条件的顺序交换为
while (state != OUT && (c = getchar()) != EOF) {
然后说OUT将计算为false,这将阻止由于短路而计算c=getchar()
。如果你想知道更多的话,就在上面。希望这能有所帮助。在while循环中更改条件的顺序:
否:
是的:
在while循环中更改条件的顺序:
否:
是的:
这是调试。有两种主要的调试方法。要么学习使用gdb之类的调试程序,要么只是在源代码中添加一堆额外的printf
行,以查看程序的位置以及执行过程中关键点的数据值。请始终在if
块中的语句周围使用大括号(特别是,如果它只是一个语句,因为不止一个语句需要大括号)。现在就学会这样做,这样以后它就不会咬你的屁股了。我会尝试学习调试器aschepler。@Greg-我一直在使用大括号,但有人对我指手画脚(说不需要大括号),我认为是常量大括号(不需要时)使源代码看起来更混乱。这是调试。有两种主要的调试方法。要么学习使用gdb之类的调试程序,要么只是在源代码中添加一堆额外的printf
行,以查看程序的位置以及在执行过程中关键点的数据值。请始终在stat周围使用大括号if
块中的元素(特别是,如果它只是一个语句,因为不止一个语句需要大括号)。现在就学会这样做,这样以后它就不会咬你的屁股了。我会尝试学习调试器aschepler。@Greg-我经常使用大括号,但有人对我指手画脚(说不需要大括号)我还以为是固定的大括号(不需要的时候)使源代码看起来更混乱。是的。另一种选择是交换内部while上条件的顺序,并利用短路。同意-这正是JoshD在其答案中提出的建议。如果你知道短路无论如何都会失败,不妨立即中断。这很有效,谢谢。我不确定我是否理解但是它(或者为什么)是有效的?很抱歉我是新手,但是短路到底意味着什么?你说我“消耗了额外的字符”是什么意思是的。另一个选择是交换内部while上条件的顺序,并利用短路。同意-这正是JoshD在回答中提出的建议。如果你知道短路无论如何都会失败,那么最好立即中断。这很有效,谢谢。我不确定我是否理解它(或为什么)但它有效吗?很抱歉我