C语言基本概念之左值

关于“左值”的困惑

我相信接触过C语言的人都听过"左值"这个概念,不过到底什么是左值呢?其实能说清楚的人其实并不多,这其中就包括很多使用C语言多年的所谓老鸟。

我听的最多的解释是:“左值就是可以出现在赋值运算符左边的东西”。

根据这个定义,我提出我的几个疑惑:

(1)

那么我们看如下代码片段:

int x, y;
x = 100;
y = x;

这里变量x既可以出现在赋值运算符的左边,又可以出现在赋值运算符的右边,难不成变量x既是左值,又是右值? 

还有一点,在C/C++中数组名不能出现在赋值运算符的左边,那么数组名是右值咯?

带着这些疑惑,让我们试图从C标准中找到答案。注意,这篇博文仅限于C语言讨论,因为C++标准对这块知识点进行了诸多扩展,等将来有机会再另起一篇博文阐述C++中的左值知识点。

 

什么是左值?

想明白什么是左值,首先需要了解下什么是表达式。

 

参考链接:

理解C和C++中的左值和右值

Value categories

Value (computer science)》(Wikipedia)

Lvalues and Rvalues

Non-modifiable Lvalues

What are lvalue and rvalue in C?

C String Literals Are Lvalues

Understanding the meaning of lvalues and rvalues in C++

值 (计算机科学)》(wikipedia

C/C++左值 右值讨论》《C/C++左值性精髓

'lvalue' considered harmful

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目 录 译者序 序 第1版序 前言 第1章 基本概念 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 1.5.1 文件复制 1.5.2 字符计数 1.5.3 行计数 1.5.4 单词计数 1.6 数组 1.7 函数 1.8 变元—按值调用 1.9 字符数组 1.10 外部变量与作用域 第2章 类型、运算符与表达式 2.1 变量名 2.2 数据类型与大小 2.3 常量 2.4 说明 2.5 算术运算符 2.6 关系运算符与逻辑运算符 2.7 类型转换 2.8 加一与减一运算符 2.9 按位运算符 2.10 赋值运算符与赋值表达式 2.11 条件表达式 2.12 运算符优先级与表达式求值次序 第3章 控制流 3.1 语句与分程序 3.2 if-else语句 3.3 else-if语句 3.4 switch语句 3.5 while与for循环语句 3.6 do-while循环语句 3.7 break语句与continue语句 3.8 goto语句与标号 第4章 函数与程序结构 4.1 函数的基本知识 4.2 返回非整数值的函数 4.3 外部变量 4.4 作用域规则 4.5 头文件 4.6 静态变量 4.7 寄存器变量 4.8 分程序结构 4.9 初始化 4.10 递归 4.11 C预处理程序 4.11.1 文件包含 4.11.2 宏替换 4.11.3 条件包含 第5章 指针与数组 5.1 指针与地址 5.2 指针与函数变元 5.3 指针与数组 5.4 地址算术运算 5.5 字符指针与函数 5.6 指针数组与指向指针的指针 5.7 多维数组 5.8 指针数组的初始化 5.9 指针与多维数组 5.10 命令行变元 5.11 指向函数的指针 5.12 复杂说明 第6章 结构 6.1 结构的基本知识 6.2 结构与函数 6.3 结构数组 6.4 结构指针 6.5 自引用结构 6.6 查找表 6.7 类型定义 6.8 联合 6.9 位字段 第7章 输入与输出 7.1 标准输入输出 7.2 格式输出—printf函数 7.3 变长变元表 7.4 格式输入—scanf函数 7.5 文件访问 7.6 错误处理—stderr和exit函数 7.7 行输入输出 7.8 其他函数 7.8.1 字符串处理函数 7.8.2 字符类测试和转换函数 7.8.3 ungetc函数 7.8.4 命令执行函数 7.8.5 存储管理函数 7.8.6 数学函数 7.8.7 随机数发生器函数 第8章 UNIX系统界面 8.1 文件描述符 8.2 低级I/O—read和write系统调用 8.3 open、creat、close和unlink系统调用 8.4 随机访问—lseek系统调用 8.5 实例—fopen和getc函数的一种实现 方法 8.6 实例—目录显示 8.7 实例—存储分配程序 附录A 参考手册 A.1 引言 A.2 词法规则 A.3 语法符号 A.4 标识符的含义 A.5 对象和左值 A.6 转换 A.7 表达式 A.8 说明 A.9 语句 A.10 外部说明 A.11 作用域与连接 A.12 预处理 A.13 语法 附录B 标准库 B.1 输入与输出:<stdio.h> B.2 字符类测试:<ctype.h> B.3 字符串函数:<string.h> B.4 数学函数:<math.h> B.5 实用函数:<stdlib.h> B.6 诊断:<assert.h> B.7 变量变元表:<stdarg.h> B.8 非局部跳转:<setjmp.h> B.9 信号处理:<signal.h> B.10 日期与时间函数:<time.h> B.11 由实现定义的限制:<limits.h>和 <float.h> 附录C 变更小结

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值