我使用的是turboc++;我的程序没有输出

我使用的是turboc++;我的程序没有输出,c,C,标题几乎说明了这一切,下面是代码: #include <stdio.h> /* Program counts blanks, tabs, and newlines */ int main(void) { int c; int b, t, nl; b = 0; t = 0; nl = 0; while ((c = getchar()) != EOF) if (c == ' ') ++b; if (c == '\t')

标题几乎说明了这一切,下面是代码:

#include <stdio.h>

/* Program counts blanks, tabs, and newlines */
int main(void)
{
  int c;
  int b, t, nl;

  b = 0;
  t = 0;
  nl = 0;

  while ((c = getchar()) != EOF)
    if (c == ' ')
      ++b;
    if (c == '\t')
      ++t;
    if (c == '\n')
      ++nl;
  printf("Input has %d blanks, %d tabs, and %d newlines\n", b, t, nl);
  return 0;
}
#包括
/*程序统计空格、制表符和换行符*/
内部主(空)
{
INTC;
int b,t,nl;
b=0;
t=0;
nl=0;
而((c=getchar())!=EOF)
如果(c='')
++b;
如果(c=='\t')
++t;
如果(c=='\n')
++nl;
printf(“输入有%d个空格、%d个制表符和%d个换行符,\n”、b、t、nl);
返回0;
}
我不明白为什么这样不行。它对空格进行计数没有问题,但是当涉及到其他空格时,它们的值总是被打印为0

不仅仅是一个“应该是这样”的回答,我真的很想要一个“它不起作用,因为…你需要这样做,因为…”的回答。我试图掌握这些概念并真正理解这门语言,而不仅仅是知道什么是有效的,什么是无效的


谢谢!你们已经得到了帮助:)。

这是因为你们的
循环缺少大括号。如果没有这些大括号,while
中唯一的内容就是第一个
if
语句。这就是为什么它只计算空格,因为你在整个文件中执行一个
if
语句,然后在退出循环后,
c
EOF
,所以其他两个
if
语句都不是真的

这是一个棘手的问题,很难看到,因为缩进看起来应该可以工作,但与Python不同,编译器不使用缩进来确定事物的位置:-)

如果在
while
后面放一个开始的大括号,在
printf
前面放一个结束的大括号,那么它应该计算所有内容

换句话说,这就是编译器看到的:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
}
if (c == '\t')
    ++t;
if (c == '\n')
    ++nl;
鉴于您想要:

while ((c = getchar()) != EOF) {
    if (c == ' ')
        ++b;
    if (c == '\t')
        ++t;
    if (c == '\n')
        ++nl;
}
我在这里看到很多“总是需要牙套”。这很好,它将防止这种情况发生,但我倾向于总是使用一个好的编辑器。例如,Emacs会自动缩进C代码,使这类事情变得非常明显。您的第二个和第三个
if
语句不会像它们那样缩进


如果您不喜欢大括号,另一种选择是在使用
if
的地方使用
else if
。不要那样做,但要理解它。

总是要坚持有时和有时,特别是第一次学习+1时。这就是为什么,顺便说一句,人们应该总是使用大括号,即使它们不是必需的,这样这种事情就不会发生(为什么K&R允许使用无大括号的变体?)+1对你来说,我们的编码标准总是需要大括号。非常好的答案,谢谢!现在一切都完全有道理了。是的,K&R的书需要更新,我想,它有点旧;-)。