C运算符按左值和右值要求分类
C11标准中对“右值”的引用仅限于以下脚注 本国际标准中有时称为“右值” 描述为“表达式的值” 正如肯·汤普森(ken Thompson)所说,左值和右值这两个术语使用得非常频繁。请注意下面的&、++运算符(摘自B手册)C运算符按左值和右值要求分类,c,C,C11标准中对“右值”的引用仅限于以下脚注 本国际标准中有时称为“右值” 描述为“表达式的值” 正如肯·汤普森(ken Thompson)所说,左值和右值这两个术语使用得非常频繁。请注意下面的&、++运算符(摘自B手册) r值::= (右值) 左值 常数 左值赋值右值 左值公司 左值公司 一元右值 &左值 右值二进制右值 右旋价值?右值:右值 右值({rvalue{,rvalue}0}01) 左值::= 名称 *右值 右值[右值] 同样,C++似乎有一个对LVALL转换()和(/P>)的L
r值::=
(右值)
左值
常数
左值赋值右值
左值公司
左值公司
一元右值
&左值
右值二进制右值
右旋价值?右值:右值
右值({rvalue{,rvalue}0}01)
左值::=
名称
*右值
右值[右值]
同样,C++似乎有一个对LVALL转换()和(/P>)的LValk的描述。
关于上述声明,我没有什么问题
< C++与C++之间的差异可能是函数重载和引用。 然而,在C语言中,规则非常简单:左操作数和几个运算符必须是左值。任何其他操作数都可以是l值或右值。通过C99标准的快速搜索,可以得到左值的as要求:
- 前缀递增和递减运算符
- 后缀递增和递减运算符
- 一元
和
运算符
- 任意赋值运算符的左
- 标识符(变量)
- 字符串文字
- 括号中的左值
- 如果左操作数是左值,则访问成员
运算符的结果 - 指向成员
运算符的指针的结果->
- 复合文字(例如
)(int[]{1,2}
- 一元
运算符的结果*
- 索引运算符的结果
[]
特别是,这些是<强>不< /强> LValk(其中一些是/可以是C++中的LV值,留给读者的练习):< /P>
- 铸模的结果
- 条件三元运算符的结果
?:
- 赋值运算符的结果
=
- 逗号运算符的结果
,
为什么要在C引用中使用,即使C标准中没有。好吧,说右值要比说表达式的值容易得多。而且这个术语非常熟悉,不会造成任何混淆。我发布了一个答案,希望它能帮助寻找同样东西的人。
我在Kenneth A.Reek的书“C上的指针”中找到了基于左值/右值的运算符分类表。本书第5.4.3节有一个运算符优先级表,其中包含每个运算符的lexp/rexp要求(运算符的操作数是否为lexp/rexp,结果是否为lexp/rexp)请注意,这是基于C89./P>一个表达式的结果的一个R11的描述似乎相当简单。C++编译器做了更多的转换和翻译,所以规则复杂,因为构造函数和析构函数和许多其他的管道涉及。所提到的更多的是关于什么是左值和右值。当前的问题更多的是关于是否有一个类似于从B语言粘贴的完整列表,为什么它们在定义上在C/C++之间是分离的,为什么C偏离了B和C++中使用的概念,但对某些操作符的左值要求也不一致需要知道哪些操作创建左值和右值。例如,cast运算符或&operator不生成左值生成&i++或(int)i++无效。如果我们看一下上面的B语法,很清楚哪个是左值。请看@bare_metal:你是对的,这些也包含在标准中。但我想你没有要求这些细节,是吗?无论如何,如果你愿意,我可以总结它们。那很好,但当你总结的时候,我不会t看起来与B中所示的语法相似?(要说+a,a+1是右值,除了某些运算符,你可能需要说一元运算符,然后是二进制运算符等等)。如果您能指出这样的链接是否存在,或者是否可以编译类似的列表,那就太好了。@bare_-metal:右值和左值之间的区别不在于语法,而在于注释。我将在一两分钟后补充这一点。