首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么python编译器不忽略exit()之后的语法错误?

为什么python编译器不忽略exit()之后的语法错误?
EN

Stack Overflow用户
提问于 2022-07-26 20:03:30
回答 1查看 74关注 0票数 -1

我有一个关于python编译器的问题。我正在运行下面的代码,但是我发现了一些不符合逻辑的错误。

如果您运行一个python代码,然后向它添加exit()函数,它将退出程序,下面的代码将不会运行。但是我将exit()函数添加到我的程序中,在exit()函数之后,我遇到了一些语法错误,程序因为语法错误而崩溃,我想知道为什么python编译器在运行之前没有优化我的代码。我用逻辑错误尝试了这个问题,它忽略了错误,比如out of range index错误等等。那么,为什么下面的代码不能工作并且发生了syntax error呢?

简单代码

代码语言:javascript
运行
复制
print("Hi")
exit()
if 

就像你看到的,我们跑

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++中,无法到达的代码(没有注释掉)甚至必须在类型匹配方面是有效的,例如,如果Tint,而y的类型是char*,那么T就不会编译。这在语法上是有效的,但是“不正确”。每优惠:在模板之外,会完全检查一个废弃的语句。if constexpr不是#if预处理指令的替代品。

但是在模板内部,它可以隐藏一些东西。https://godbolt.org/z/frTcbMb3T

代码语言:javascript
运行
复制
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
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73129145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档