gpt4 book ai didi

c++ - 类 C 编译器如何解释 if 语句

转载 作者:IT老高 更新时间:2023-10-28 22:18:03 26 4
gpt4 key购买 nike

在类 C 语言中,我们习惯于使用类似于以下的 if 语句:

if(x == 5) {
//do something
}
else if(x == 7) {
//do something else
}
else if(x == 9) {
//do something else
} else {
//do something else
}

我的问题是,编译器是否以这种方式看到 if 语句,或者它最终被解释为:

if(x == 5) {
//do something
}
else {
if(x == 7) {
//do something
}
else {
if(x == 9) {
//do something
}
else {
//do something else
}
}
}

编辑:我意识到虽然这个问题在我的脑海中是有道理的,但对于其他普通民众来说,它可能听起来相当愚蠢。我更多地指的是 AST 的外观,以及“else-if”语句是否有任何特殊的 AST 案例,或者是否将其编译为级联 if/else block 。

最佳答案

它们等同于 C 编译器。 C 中没有特殊语法 else if。第二个 if 只是另一个 if 语句。


为了更清楚,根据C99标准,if语句定义为

selection-statement:
if (expression) statement
if (expression) statement else statement
switch (expression) statement

复合语句定义为

compound-statement:
{block-item-list(opt) }
block-item-list:
block-item
block-item-list block-item
block-item:
declaration
statement

当编译器前端尝试理解源代码文件时,它通常遵循以下步骤:

  1. 词法分析:将纯文本源代码转换为“ token ”列表
  2. 语义分析:解析token列表并生成抽象语法树(AST)

然后将树传递给编译器中间端(优化)或后端(生成机器码)

在你的情况下这个 if 语句

if(x == 7) {
//do something else
} else if(x == 9) {
//do something else
} else {
//do something else
}

被解析为选择语句中的选择语句,

    selection-stmt
/ | \
exp stmt stmt
| | |
... ... selection-stmt
/ | \
exp stmt stmt
| | |
... ... ...

还有这个

if(x == 7) {
//do something else
} else {
if(x == 9) {
//do something else
} else {
//do something else
}
}

在选择语句中的复合语句中是相同的选择语句:

    selection-stmt
/ | \
exp stmt stmt
| | |
... ... compound-stmt
|
block-item-list
|
block-item
|
stmt
|
selection-stmt
/ | \
exp stmt stmt
| | |
... ... ...

所以他们有不同的 AST。但它对编译器后端没有任何影响:正如您在 AST 中看到的那样,没有结构上的变化。

关于c++ - 类 C 编译器如何解释 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com