【问题标题】:Are literal strings and function return values lvalues or rvalues?文字字符串和函数返回值是左值还是右值?
【发布时间】:2011-01-03 13:11:59
【问题描述】:
  1. 只是想知道文字字符串是左值还是右值。其他文字(如 int、float、char 等)是左值还是右值?

  2. 函数的返回值是左值还是右值?

你如何分辨?

【问题讨论】:

  • 我不确定“左值”和“右值”是什么意思。你的意思是这个值可以站在操作员的左侧或右侧吗?如果是,您应该具体说明您的问题,因为您可以写入所有非 const 变量。函数的返回值为 const。
  • @Gaim:左值和右值是有特定含义的常用术语。
  • @Gaim:左值和右值是编译器和语言规范级别的说法。在这种情况下,它们指的是 C 的语法。
  • 一篇好文章在这里eli.thegreenplace.net/2011/12/15/…

标签: c lvalue rvalue


【解决方案1】:

C 中有两种表达式: 1. 左值:作为左值的表达式可能出现在赋值的左侧或右侧。 2. 右值:作为右值的表达式可以出现在赋值的右侧,但不能出现在左侧。 变量是左值,因此可能出现在赋值的左侧。数字文字是右值,因此不能被赋值,也不能出现在左侧。以下是一个有效的陈述: 整数 g = 20; 但以下不是有效的语句,会产生编译时错误: 10=20;

【讨论】:

    【解决方案2】:

    有一个来自 Microsoft 的用于 C++ 的 definition。根据这个定义, 一个文字字符串,比如“hello world”,是左值,因为它是常量而不是临时的。实际上,它会在您的应用程序的整个生命周期中持续存在。

    【讨论】:

      【解决方案3】:
      1. 字符串字面量是左值,但不能更改
      2. 右值,但如果是指针且非NULL,则它指向的对象是左值

      C 标准承认原始术语代表 left 和 right,如 L = R;但是,它说将左值视为定位器值,这大致意味着您可以获得对象的地址,因此该对象具有位置。 (参见C99 中的 6.3.2.1。)

      出于同样的原因,该标准已经放弃了术语右值,而只使用“表达式的值”,这几乎是所有内容,包括诸如 int、chars、float 等文字。此外,您可以做的任何事情使用右值也可以使用左值,因此您可以将所有左值视为右值。

      【讨论】:

      • +1 表示简短而正确的答案。我不知道 C 标准在任何地方都没有使用“右值”,但实际上就是这样(只是做了一个搜索!)。与 C++ 的另一个有趣的区别。我有一天越过的另一个问题是,函数指示符是 C 中的右值,而它们是 C++ 中的左值。因此,C 中的op& 可以应用于某些右值——那些指定函数的右值。
      • 它确实在索引中使用了右值。 :P
      • @Roger:谢谢!我只是想知道字符串文字以外的其他文字? @Johannes:我昨天刚刚在网上看到函数定义符是左值,并记得它是用于 C 的。我错了吗?
      • C99, 6.3.2.1/4:“函数指示符是具有函数类型的表达式。”我相信这是说它们是右值,因为它们没有对象类型。如果您真的很好奇,我链接到您可以找到 C 标准的位置,但我不保证您在标准化后的理智。
      • 特别是,C99 中的复合文字是左值。所以你实际上可以做int *p = &(int){ 42 }; printf("%d", *p);。
      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多