我在某处阅读了有关编译器和解释器的以下文档:-
我的疑问来自以下代码:
int main()
{
printf("hello")
scanf("%d",&j);
return 0;
}
我正在使用
MINGW GCC
编译器。当我编译上面的代码时,会发生以下事情:首先我得到了错误
error: expected ';' before 'scanf()'
在我纠正上述错误后,我得到了第二个错误
error: 'j' undeclared (first use in this function)
所以我想知道为什么没有同时列出这两个错误?
最佳答案
编译器和解释器在技术上是两个不同的东西,尽管有时边界可能非常不稳定。
编译器基本上无非是语言翻译器。它以源语言作为输入并生成目标语言作为输出。
解释器采用一种语言(无论是高级还是低级)并执行该语言描述的代码。
混淆主要是因为大多数现代脚本语言都包含编译器和解释器,其中编译器采用脚本语言并创建一个较低级别的等价物(类似于二进制机器语言),然后解释器读取和执行。
至于您的编译器错误问题,很可能是因为编译器由于第一个错误而无法继续解析 scanf
调用,而只是跳过它(包括未声明的变量)。
您还应该知道,在 C 中,某些错误实际上可能会导致代码中出现更多错误,例如在其他情况下是正确的
int j
printf("Enter something: ");
scanf("%d", &j);
由于在变量
j
声明后缺少分号,您将收到错误,但您也会收到 scanf
行的错误,因为编译器找不到变量 j
,即使 scanf
调用在其他方面是正确的。另一个会在无关代码中产生后续错误的典型错误示例是忘记头文件中结构的终止分号。如果它是最后一个结构,您甚至可能不会在头文件中收到任何错误,只会在包含头文件的源文件中出现不相关的错误。
关于编译器和解释器之间的混淆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21475744/