Yue*_*hou 3 c++ expression language-lawyer
我知道什么是“表达类别”,但我对“表达类型”感到困惑。
表达式求值可能会产生结果。
那么,结果的类型就是“表达式的类型”吗?
但是,根据www.cppreference.com :,它说:
每个 C++ 表达式都有两个独立的属性:类型和值类别。
那么,“类型”是指表达式的类型,还是表达式结果的类型?
我想这可能需要一些编译原理的知识(我对此一无所知),到底是先判断表达式的类型,然后根据它来判断表达式结果的类型?或者表达式结果的类型就是表达式的类型?
请从编译原理的角度给出一个通俗易懂的解释。
\n\n\n\n每个 C++ 表达式都有两个独立的属性:类型和值类别。
\n那么,“type”是指表达式的类型吗
\n
是的。“类型”确实指的是那里的表达式的类型。
\n\n\n那么,结果的类型就是“表达式的类型”吗?
\n
不必要。表达式和表达式的结果是不同的东西。在某些情况下,表达式及其结果确实具有相同的类型,而在其他情况下,这些类型不同。此外,有些表达式没有任何结果。
\n表达式的结果在标准中定义如下:
\n\n\n[基本.lval]
\n左值的结果是表达式表示的实体。\n纯右值的结果是表达式存储到其上下文中的值;类型为 cv void 的纯右值没有结果。\n结果为值 V 的纯右值有时被称为具有或命名为值 V。\n纯右值的结果对象是由该纯右值初始化的对象;用于计算内置运算符的操作数值的非丢弃纯右值或类型为 cv void 的纯右值没有结果对象。
\n
表达式的类型是为每种表达式定义的。例如:
\n\n\n[expr.unary.op]
\n一元 * 运算符执行间接寻址。\n其操作数应是类型为 \xe2\x80\x9c 的纯右值,指向 T\xe2\x80\x9d,其中 T 是对象或函数类型。\n该运算符生成类型 T 的左值,表示操作数指向的对象或函数。
\n
高亮部分表示表达式的类别为左值,表达式的类型为T。
例如:
\nint i = 0;\nint* p = &i;\nint j = *p;\nRun Code Online (Sandbox Code Playgroud)\n表达式的类型*p按照int引用的规则。它是一个左值,结果是对象 - 也由变量命名i- 其类型也是int。
此外,本节[expr.type]指定了可以调整任何类型表达式的类型的规则。
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |