Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序不收集计数对吗?_C - Fatal编程技术网

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在回答中提出的建议。如果你知道短路无论如何都会失败,那么最好立即中断。这很有效,谢谢。我不确定我是否理解它(或为什么)但它有效吗?很抱歉我