我编写了一个程序,它接受一个输入字符并输出该字符,如下所示

int ch = getchar();
printf("%c", ch);

它像我预期的那样工作。然后我决定先欢迎并打印Hello
printf("Hello!\n");
int ch = getchar();
printf("%c", ch);

令我惊讶的是,这导致编译器抛出两个错误:
错误C2065:“ch”:未声明的标识符
错误C2143:语法错误:“type”之前缺少“;”
我不明白为什么加上第一行会导致这种情况发生。不管怎样,我重构了程序以去掉int声明,错误神奇地消失了。
printf("Hello!\n");
printf("%c", getchar());

发生什么事?是什么魔力导致这些错误出现然后消失?

最佳答案

C89标准不允许在块开始后创建新变量,但在较新的C99标准中允许。
您正在使用较旧的编译器或不完全符合C99的编译器。
您的代码示例应该在任何好的编译器上都能正常工作。Works on gcc-4.3.4
替代解决方案:
您可以通过两种方式解决问题:
在块的开头声明变量:

int ch;
printf("Hello!\n");
ch = getchar();
printf("%c", ch);

或者
创建用于声明变量的新块:
printf("Hello!\n");
{
    int ch = getchar();
    printf("%c", ch);
}

建议:
您真的应该更改您的编译器,因为如果我记得正确的话,gcc甚至在c99之前就支持它作为编译器扩展。

09-10 06:47
查看更多