我有一个关于python编译器的问题。我正在运行下面的代码,但是我发现了一些不符合逻辑的错误。
如果您运行一个python代码,然后向它添加exit()
函数,它将退出程序,下面的代码将不会运行。但是我将exit()
函数添加到我的程序中,在exit()
函数之后,我遇到了一些语法错误,程序因为语法错误而崩溃,我想知道为什么python编译器在运行之前没有优化我的代码。我用逻辑错误尝试了这个问题,它忽略了错误,比如out of range index
错误等等。那么,为什么下面的代码不能工作并且发生了syntax error
呢?
简单代码
print("Hi")
exit()
if
就像你看到的,我们跑
发布于 2022-07-26 20:16:03
它不能准确地编译您的程序,因为它是一个编译器(到字节码,它稍后会解释)。当它看到一个exit()
时,它不会停止解析,不像shell每次只读取和解释一行shell脚本。(这不是“优化”,BTW)。
Python将其编译为字节码,如果到达程序中的字节码,则调用exit
。即使是无法到达的代码也必须在语法上是有效的,这样整个文件才能编译。但是由于它从来没有实际执行,所以它不会导致任何运行时错误。
这不是武断的过程。C编译器工作得更聪明,C编译器如何检测它? 例如,如果您使用C运行一个
while 1
程序,由于逻辑原因,它不会运行。但是为什么蟒蛇不做同样的事情呢?
,那不是真的,
C编译器会因无法访问的块(如int foo(){ if(0) if if; }
)中的语法错误而窒息。而且,while 1
不是有效的C语法。
https://godbolt.org/z/cP83Y866b。只有#if 0
预处理程序或注释才能向编译器隐藏内容,这样它就不必是有效的语法和语法。
语法和语法必须在整个文件中有效,才能将其解析为编译器可以编译的东西。
在C和C++中,无法到达的代码(没有注释掉)甚至必须在类型匹配方面是有效的,例如,如果T
是int
,而y
的类型是char*
,那么T
就不会编译。这在语法上是有效的,但是“不正确”。每优惠:在模板之外,会完全检查一个废弃的语句。if constexpr
不是#if
预处理指令的替代品。
但是在模板内部,它可以隐藏一些东西。https://godbolt.org/z/frTcbMb3T
template <typename T> // being a template function makes if constexpr special
void foo(int x) {
if constexpr (false) {
int x = "hi"; // ill-formed, type mismatch. But still valid *syntax*
}
#if 1 // 0 would truly ignore all text until the closing #endif
if constexpr (false) {
// int x = = 2; // syntax error if uncommented
}
#endif
}
https://stackoverflow.com/questions/73129145
复制相似问题