Are literal strings and function return values lvalues or rvalues?
只是想知道文字字符串是左值还是右值。其他文字(如int、float、char等)是左值还是右值?
函数的返回值是左值还是右值?
你怎么区分?
- 我不知道"左值"和"右值"是什么意思。您的意思是这个值可以站在操作员的左边还是右边?如果是,您应该指定您的问题,因为您可以写入所有非常量变量。函数的返回值为常量。
- @gaim:左值和右值是具有特定含义的常用术语。
- @gaim:lvalue和rvalue是编译器和语言规范级别的语言。在这种情况下,它们指的是C的语法。
- 这里有一篇好文章eli.thegreenplace.net/2011/12/15/…
字符串文本是lvalue,但不能更改它们
右值,但如果它是指针且非空,则它指向的对象是左值
c标准将原来的左右两个术语识别为L = R中的左右两个;但是,它表示将lvalue作为定位值,这大致意味着你可以得到一个对象的地址,因此该对象有一个位置。(见C99中的6.3.2.1。)
同样,标准已经放弃了"值"这个术语,只使用了"表达式的值",这实际上是所有的内容,包括诸如int、chars、float等文本。此外,可以对值执行的任何操作也可以对值执行,因此可以将所有的值视为值。
- +1表示简短正确的答案。我不知道C标准在任何地方都不使用"rvalue",但实际上是这样的(只是做了一个搜索!)另一个有趣的区别是C++。我过了一天的另一个例子是函数标识符是C中的rVals,而它们是C++中的LValk。因此,c中的op&可以应用于某些值——那些指定函数的值。
- 它确实在索引中使用了右值。P
- @罗杰:谢谢!我只是想知道字符串文字以外的其他文字?@约翰内斯:我刚才看到功能设计是昨天在网上看到的,我记得是为C写的。我错了吗?
- 蒂姆:我最后特别提到了那些,几乎所有的东西都是右值,而那些文字不是左值。
- C99,6.3.2.1/4:"函数指示符是一个具有函数类型的表达式。"我认为这意味着它们是rvalue,因为它们没有对象类型。如果你真的很好奇的话,我链接到哪里可以找到C标准,但是在标准化之后,我不保证你的健康。
- @罗杰:谢谢!我想问一下字符串文字以外的文字是否是左值。
- 特别地,C99中的复合文字是lvalues。所以实际上你可以做int *p = &(int){ 42 }; printf("%d", *p);。
- 以前没有考虑过,但它用一种奇怪的方式讲得通,并且与字符串文字相一致。
- 约翰内斯:在复合文字的例子中,这是什么意思?我尝试(),但它是错误的,因为它仍然是右值而不是左值。
- 蒂姆:这只是复合文字语法的一部分。如果你把它改成parens,那么你就得到了(int)(42),它和(int)42是一样的,只是一个多余的强制转换,实际上是一个右值。
C中有两种表达式:1。左值:作为左值的表达式可能出现在赋值的左侧或右侧。2。右值:作为右值的表达式可能出现在赋值的右边,但不是左边。变量是lvalue,因此可能出现在赋值的左侧。数字文本是值,因此可能无法分配,也不能出现在左侧。以下是有效的声明:int g=20;但以下语句无效,将生成编译时错误:10=20;
微软有一个C++的定义。根据这个定义,一个文本字符串,比如说"hello world",是lvalue,因为它是常量而不是临时的。实际上,它会在应用程序的整个生命周期中持续存在。