C编程 - 关于花括号的混乱

Gel*_*elo 2 c scope

以下代码用于将多个连续空格替换为1个空格.虽然我设法做到了,但我对使用花括号感到困惑.

这个实际运行正常:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int ch, lastch;
lastch = 'a';
while((ch = getchar())!= EOF)
{

    if(ch == ' ')
    {
        if (lastch != ' ')
        putchar(ch);


    }
    else
        putchar(ch);
        lastch = ch;

}
}
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚为什么这个不是,只是在内部循环和else语句中放置花括号:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int ch, lastch;
lastch = 'a';
while((ch = getchar())!= EOF)
{

    if(ch == ' ')
    {
        if (lastch != ' ')
        {
            putchar(ch);
        }

    }
    else
    {
        putchar(ch);
        lastch = ch;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我可以不用花括号括起一个循环吗?我已经读到第二个是一个很好的做法,让它可读,但我做错了什么?

jua*_*nza 8

两者之间的唯一区别是else.没有大括号,它会跨越完整语句的结尾,这是;下一行,即下一行:

else
    putchar(ch); /* end of else */
lastch = ch;     /* outside of if-else */
Run Code Online (Sandbox Code Playgroud)

有了括号,它也涵盖了lastch作业.

这同样适用于if声明,但是你只有一行,所以没有区别.