C 语言 Lvalue 和 Rvalue28 Aug 2024 | 5 分钟阅读 在本文中,我们将结合示例讨论 C 语言中的左值 (lvalue) 和右值 (rvalue)。 什么是左值?左值 仅仅表示一个可识别内存地址的项(即具有地址的项)。任何赋值语句都必须允许数据存储在“左值”中。函数、表达式(如a+b)或常量(如3, 4 等)不能成为左值。 “l-value” 这个术语描述了一个用于标识对象的内存位置。赋值运算符 (=) 的左侧或右侧都可能出现左值。左值常被用作标识。“可修改的左值”是指指向可修改位置的表达式。对于可修改的左值,禁止使用具有数组类型、不完整类型或 const 属性的类型。为了使其成为可编辑的左值,结构或联合体中不能有任何具有 const 属性的成员。 变量的值是存储在由标识符名称指定的位置的值。如果一个标识符指向一个内存位置,并且其类型是算术类型、结构体、联合体或指针,那么它就符合可修改左值的条件。例如,如果 ptr 是指向某个存储区域的指针,那么 *ptr 就是一个可修改的左值,它标识了 ptr 指向的存储区域。C 语言中,定位(指向)对象的表达式被赋予了一个新的术语,即“定位值”。左值由以下一项描述:
示例输出 The value of 'a' is 1 The value of 'b' is 1 说明 在此示例中,a 和 b 被声明为整型变量。将值 1 赋给 a,然后将相同的值赋给 b。结果将显示 a 和 b 的值均为 1。 由于赋值运算符 (=) 的左侧需要一个左值,因此行 9 = a; 将导致编译错误。在此示例中,字面量 9 不能被赋新值,因此它不是一个合法的左值。 什么是右值?右值 仅仅表示一个没有地址或内存中可查找位置的对象。它可以产生一个常量表达式或值作为返回值。一个简单的表达式如 a+b 会得到一个常量。 “r-value” 这个术语描述了一个存储在内存中特定地址的数据项。右值 是一个不能被赋值的表达式。因此,它只能出现在赋值运算符 (=) 的右侧,而不能出现在左侧。 示例输出 The value of 'a' is 1 The value of 'b' is 0 The value at index 12 of 'arr' is 42 The value of 'obj.m' is 24 说明 在此示例中,变量 a, b, p, q, arr, obj 和 ptr 都被声明了。这里有几个涉及左值和右值的赋值和运算示例。 输出将分别显示 a, b 的值,以及 arr 中索引为 12 的元素的值,和 obj 的成员 m 的值,依次为 1, 0, 42 和 24。 注意:一元 & (取地址) 运算符需要一个左值作为操作数。换句话说,当且仅当 n 是左值时,&n 才是一个合法的表达式。因此,像 &12 这样的表达式是不正确的。再次说明,12 是不可寻址的,因为它不指向一个对象。例如:输出 The value of 'a' is undefined (garbage value) The value of 'x' is undefined (garbage value) The value of 'y' is undefined (garbage value) 说明 在此示例中,a, p, x, 和 y 被声明为变量。赋值运算符 (=) 用于使 p 能够访问 a 的地址。然而,因为 a 的地址(&a)是一个右值,不能被赋新值,所以行 &a = p; 将导致编译错误。 行 (x< y? y: x) = 0 使用了三元表达式。三元表达式的结果是一个左值,这使得我们可以根据语句 (x y) 的结果,将 y 或 x 赋值为 0。 |
在本文中,您将学习如何用 C 语言创建一个计算电费的程序。代码 #include <stdio.h> #define UNIT_RATE 7.5 // 每消耗单位的费率 #define TAX_RATE 0.1 // 税率 //计算账单金额的函数 float calculateBill(int units) { float billAmount, taxAmount; ...
阅读 3 分钟
在本文中,我们将讨论其语法、函数和示例。C11标准引入了一个实用的特性,使得泛型编程成为可能:_Generic关键字。它通过支持条件性...使得创建易于处理多种数据类型的泛型代码变得容易。
阅读 12 分钟
到目前为止,C 程序操作是在一个未保存任何内容的位置或终端上执行的。但在软件行业,大多数应用程序都是为了存储它们获取的数据而创建的。将检索到的信息保存在文件中是一种...
14 分钟阅读
位填充是数字通信中确保可靠数据传输的常用技术。简单来说,位填充涉及在传输数据中添加额外的位,以确保接收器能够准确地检测数据帧的开始和结束。这种技术...
7 分钟阅读
字符串是许多 C 编程应用程序的重要组成部分。理解与字符串相关的各种函数对于高效的字符串操作和处理至关重要。strlen() 函数用于查找字符串的长度。这篇博文将详细介绍...
阅读 3 分钟
C语言打印“hello”而不使用分号我们可以不使用分号在C语言中打印“hello”或“hello world”或其他任何内容。有多种方法可以做到这一点:使用if 使用switch 使用循环等。程序1:使用if语句让我们看一个打印“hello world”的简单C语言示例...
阅读1分钟
在本文中,我们将讨论 C 语言中的可重入函数及其属性和示例。如果有一种方法可以在函数运行过程中停止它,处理中断服务例程,然后在不损坏的情况下重新启动之前运行的函数,那么...
阅读 3 分钟
在 C 语言编程中,我们经常会遇到 int、float 和 char 等数据类型。然而,size_t 是 C 程序中经常使用但不太为人知的数据类型。在这篇博文中,我们将通过定义、语法和示例及输出来详细介绍 size_t...
阅读 3 分钟
C 语言程序 C 语言求各位数字之和:我们可以仅通过循环和数学运算来用 C 语言编写各位数字之和的程序。算法 要用 C 程序获取各位数字之和,请使用以下算法:步骤 1:获取数字...
阅读1分钟
在本文中,我们将讨论lseek()函数及其语法、参数、示例、优点和缺点。lseek()是C语言中的一个函数,它允许您将文件指针移动到文件中的特定位置。文件指针表示...
阅读9分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India