gpt4 book ai didi

根据左值和右值要求对 C 运算符进行分类

转载 作者:太空宇宙 更新时间:2023-11-04 08:35:08 25 4
gpt4 key购买 nike

C11 标准中对“右值”的引用仅限于以下脚注。

"What is sometimes called ‘‘rvalue’’ is in this International Standard described as the ‘‘value of an expression’’"

ken Thompson 的 B manual大量使用术语左值和右值。请注意下面的 &,++ 运算符(摘自 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 中的运算符是否存在这样的“引用”(链接等)“类似于”B 运算符在左值和右值方面的手动要求? (请参阅我熟悉某些 C 运算符的左值要求)

  2. 术语“右值”在 B 中广泛使用并在 C++ 中使用,为什么在 C 中缺少它?

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

最佳答案

C 和 C++ 在右值方面的区别可能在于函数重载和引用。

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

  • 前缀自增自减运算符
  • 后缀自增自减运算符
  • 一元&运算符
  • 任何赋值运算符的左边

因此没有必要为表达式的值(右值)命名。它们只是表达式,并使用它们的值。

关于何时产生左值:

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

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

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

为什么在 C 引用中使用,即使 C 标准中没有?好吧,说右值比说表达式的值要容易得多。而且这个术语足够熟悉,不会造成任何混淆。

关于根据左值和右值要求对 C 运算符进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com