根据左值和右值要求进行C算子分类

时间:2014-10-26 15:07:05

标签: c

参考" rvalue"在C11标准中仅限于以下脚注。

  

"有时被称为''rvalue'的是本国际标准   被描述为''表达的价值''"

ken Thompson的B manual使用术语lvalue&价值很高。请注意下面的&,++运算符(摘自B手册)

rvalue ::=
    ( rvalue )
    lvalue
    constant
    lvalue assign rvalue
    inc-dec lvalue
    lvalue inc-dec
    unary rvalue
    & lvalue
    rvalue binary rvalue
    rvalue ? rvalue : rvalue
    rvalue ( {rvalue {, rvalue}0 }01 )
lvalue ::=
    name
    * rvalue
    rvalue [ rvalue ]

类似地,C ++似乎有左值转换的左值(lvalue_to_rvalue1)和lvalue_to_rvalue2

的描述

关于上述陈述我几乎没有问题。

  1. C&#34中的运营商是否存在这样的"参考"(链接等);类似"对于左值和右值的操作员的手动要求右值条款? (请注意我熟悉某些C运营商的左值要求)

  2. 术语" rvalue"广泛用于B并在C ++中使用,为什么C中缺少这个?

  3. 左值转换是左右转换是特定于C ++而不是C(由标准间接涵盖),如果涵盖,请引用标准中的相关部分吗?

2 个答案:

答案 0 :(得分:2)

关于rvalues的C和C ++之间的区别可能是函数重载和引用。

但是,在C中,规则非常简单:左操作数的几个运算符必须是左值。任何其他其他操作数可以是l值或rvalue。通过C99标准的快速搜索给出了左值的要求:

  • 前缀增量和减量运算符
  • 后缀增量和减量运算符
  • 一元&运营商
  • 任何赋值运算符的左侧

因此没有必要为表达式的值(rvalue)添加名称。它们只是表达式,使用它们的值。

关于何时产生左值:

  • 标识符(变量)
  • 字符串文字
  • 括号中的左值
  • 访问成员.运算符的结果,如果左操作数是左值
  • 指向成员->运算符的结果
  • 复合文字(例如(int[]{1,2}
  • 一元*运算符的结果
  • 索引运算符[]
  • 的结果

值得注意的是,这些不是左值(其中一些是/可能是C ++中的左值,留给读者练习):

  • 演员的结果
  • 条件三元运算符?:
  • 的结果
  • 赋值运算符=
  • 的结果
  • 逗号运算符,
  • 的结果

为什么在C引用中使用,即使C标准中没有?嗯,说 rvalue 比说表达式的值要容易得多。这个词很熟悉,不会产生任何混淆。

答案 1 :(得分:0)

我正在发布一个答案,希望它可以帮助那些正在寻找同样事情的人。 我在Kenneth A.Reek的书"指针C"中找到了基于左值/右值的运算符分类表。本书第5.4.3节有一个运算符优先级表,其中包含每个运算符的lexp / rexp要求(运算符的操作数是否为lexp / rexp以及结果是否为lexp / rexp)。请注意,这是基于C89。