0

我尝试使用x86-64 clang 10.0.0 Ast Viewer打印以下代码的 AST

int main() {return  'c';}

我得到了这个:

TranslationUnitDecl
`-FunctionDecl <line:1:1, col:25> col:5 main 'int ()'
  `-CompoundStmt <col:12, col:25>
    `-ReturnStmt <col:13, col:21>
      `-ImplicitCastExpr <col:21> 'int' <IntegralCast>
        `-CharacterLiteral <col:21> 'char' 99

现在,在此之后,我尝试将 return char 'c' 更改为 'cw' 并得到:

int main() {return  'cw';}

我得到了这个:

TranslationUnitDecl
`-FunctionDecl <line:1:1, col:26> col:5 main 'int ()'
  `-CompoundStmt <col:12, col:26>
    `-ReturnStmt <col:13, col:21>
      `-CharacterLiteral <col:21> 'int' 25463

现在,为什么 -ImplicitCastExpr 消失了,甚至从 ('char' 99) 现在变成了 ('int' 25463)。我需要解释,谢谢。

4

1 回答 1

2

根据 cpp-reference ( https://en.cppreference.com/w/cpp/language/character_literal ):

窄字符文字或普通字符文字,例如“a”或“\n”或“\13”。这种文字的类型为 char..

以及关于多字符文字:

多字符文字,例如“AB”,具有 int 类型和实现定义的值。

因此,对于您的第一个示例,您有一个窄字符文字“c”,它被隐式转换为 int,因为 main 的返回类型是 int。另一方面,多字符文字 'cw' 已被视为 int,因此它不需要隐式强制转换。

请注意,这是针对 C++ 的。在 C 中,(窄字符和多字符文字)都是 int 类型。

于 2020-06-26T10:57:09.243 回答