3

我写了一个程序,它接受一个输入字符并输出该字符,就像这样

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

它像我预期的那样工作。然后我决定先欢迎并打印Hello

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

令我惊讶的是,这导致编译器抛出两个错误:

错误 C2065:“ch”:未声明的标识符
错误 C2143:语法错误:缺少“;” 在“类型”之前

我不明白为什么添加第一行会导致这种情况发生。无论如何,我重构了程序以摆脱int声明,错误神奇地消失了。

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

这是怎么回事?导致这些错误出现然后消失的魔法是什么?

4

4 回答 4

5

如果您使用的是较旧的 c 编译器,则必须先进行所有变量声明。尝试:

int ch;
printf("Hello!\n");
ch = getchar();
printf("%c", ch);
于 2012-05-02T02:42:07.277 回答
3

在 C89 标准中不允许在块开始后创建新变量,但在较新的 C99 标准 中允许。

您正在使用较旧的编译器或不完全符合 c99 的编译器。
您的代码示例应该可以在任何好的编译器上正常工作。适用于 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 之前就支持它作为编译器扩展。

于 2012-05-02T02:45:15.667 回答
2

C99 之前的 C 版本不允许“混合声明和代码”,这意味着您必须在作用域的开头声明所有变量。与 C++ 编译器一样,现代 C 编译器允许混合声明和代码。一些非 C99 编译器甚至允许它作为扩展。

我认为这是为了让编译器更容易确定堆栈上实际需要多少空间,或者类似的东西。

于 2012-05-02T02:45:59.847 回答
0

很可能,您使用的是相当老的 C 编译器。可能是支持 C89 的一种。使用 so 会强制您在块中的任何内容之前声明任何变量(例如函数或 main) 两种方法:首先声明 ch:

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

或者,更好的是,尝试更改您的编译器。您使用的是什么操作系统?视窗?Linux?苹果电脑?

另外,快速说明。您正在使用 getchar 获取整数。

尝试使用 scanf("%d", &ch) 代替 getchar。或者,如果您确实需要使用 getchar 并将其打印为 char,请将 ch 声明为 char 本身,如果您需要再次将其用作整数,请使用 itoa 函数,它将 char 转换为整数.

于 2012-05-02T03:59:57.563 回答