假设我想用某种OO语言构建一个C编译器,所以我创建了类Scope
,Object
,LValue
,Type
,{{1}这样的类},Pointer
等
我需要了解的是类型,值,表达式和对象之间的确切关系。因为一些C引用说的是:
表达式评估为左值。
在其他地方,您可以阅读以下内容:
lvalue 是表达式......
那么,C概念究竟是如何相互关联的呢?
对于二进制表达式,加上Expression
,a + b
和a
个操作数,是那些表达式吗?还是对象?或者只是 types 可能是对象 ?
考虑一个简单的代码:
b
int a = 1;
a++;
是表达式语句,对吧?a++;
是表达式,带有后缀增量运算符,对吧?a++
,那么a
是什么?是表达式,对象还是左值?或a
表达式评估为左值,此左值具有关联的对象和< EM>型? 编辑:我正在做的是编写一个允许“在JavaScript中编写C”的库(名为a
)。
考虑以下C函数:
jsc
在JavaScript中使用void main() {
int a = 100;
int b = 200;
int c = 300;
return a + (b + c);
}
构建器接口,您可以像这样编写该函数:
jsc
内部var _ = require('jsc').Builder.context();
var main = _.func(_ => {
var a = _.int(100);
var b = _.int(200);
var c = _.int(300);
_.return(_.['+'](a, _['+'](b, c)));
});
console.log(main.compile());
会生成以下内容:
jsc
答案 0 :(得分:3)
我需要了解的是类型,值,表达式和对象之间的确切关系
表达式具有类型,并且e 评估值。对象包含的数据在解释为特定类型时可能表示值(可能,因为对象可能未初始化或以其他方式包含无效数据)。左值(它是一种表达式)是指对象。引用标准中的相关定义:
<强> 3.15 强>
<强>对象强>
执行环境中的数据存储区域,其内容可以表示值
<强> 3.19 强>
<强>值强>
当解释为具有特定类型
时,对象内容的精确含义6.3.2.1左值,数组和函数指示符
左值是一个表达式(对象类型不是
void
),可能指定一个对象
a++;
是表达式语句,对吗?
是的,表达式语句是一个后跟分号的表达式(语法规则:“ expression_statement :表达式 opt ; < / strong>“来自标准6.8.3节)。 a++
是一个表达式,因此a++;
是一个表达式语句。
a++
是表达式,带有后缀增量运算符,对吗?
右。语法的相关条款是“ postfix-expression : postfix-expression ++ ”,“ postfix-expression : primary-expression “(第6.5.2节)和” primary-expression :标识符“(第6.5.1节)。因此,我们为a++;
得到以下推导(跳过部分表达式层次结构):
expression-statement
expression ';'
postfix-expression ';'
postfix-expression '++' ';'
primary-expression '++' ';'
identifier '++' ';'
'a' '++' ';'
a
,那么a
是什么?是表达,对象还是左值?或a
是一个求值为左值的表达式,这个左值是否有关联的对象和类型?
语法a
是一个标识符,它是一个主表达式,它是一个表达式。从语义上讲,它是变量的名称,变量是对象。如上所述,“左值是一个表达式(对象类型不是void
),可能指定一个对象”(第6.3.2.1节),因此a
也是lvalue