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

时间:2015-06-22 06:24:43

标签: 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;

}
}

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

#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;
    }
}
}

我是否可以在带花括号的循环中包含一个循环?我已经读过,第二个是让它可读的好习惯,但是我做错了什么?

2 个答案:

答案 0 :(得分:8)

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

else
    putchar(ch); /* end of else */
lastch = ch;     /* outside of if-else */

使用大括号,它也涵盖lastch作业。

这同样适用于if语句,但是你只有一行,所以没有区别。

答案 1 :(得分:3)

任何控制结构(ifelseforwhile等)都在代码上运行。块通常用花括号({})表示,但如果省略,则单个语句充当块。请注意,与Python不同,例如,缩进在C中没有意义,它只是让代码更具可读性的说服力。

话虽如此,让我们检查一下你的else块:

else
    putchar(ch);
    lastch = ch;

由于此处没有花括号,因此该块实际上等于以下内容:

else
{
    putchar(ch);
}
lastch = ch;

而不是第二个代码段中的块。在这里,lastch = ch的缩进确实帮助我们理解了代码,由于不良缩进使得它看起来好像它是else块的一部分而实际上它不是。

相关问题