C:值vs类型vs表达式

时间:2016-08-24 22:49:43

标签: c compiler-construction

假设我想用某种OO语言构建一个C编译器,所以我创建了类ScopeObjectLValueType,{{1}这样的类},Pointer

我需要了解的是类型,值,表达式和对象之间的确切关系。因为一些C引用说的是:

  

表达式评估为左值。

在其他地方,您可以阅读以下内容:

  

lvalue 表达式......

那么,C概念究竟是如何相互关联的呢?

对于二进制表达式,加上Expressiona + ba个操作数,是那些表达式吗?还是对象?或者只是 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

1 个答案:

答案 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