【 第5章 操作符和表达式】

《C和指针 第5章 操作符和表达式》

本章讲了两件事:

  1. 掌握操作符的优先级去计算表达式的值
  2. 掌握左值和右值


一、操作符的优先级

( ) > ( ) > [ ] > . > ->
单目运算符
算数运算符 (小学2年级学的加减乘除)
关系运算符 (小学四年级学的不等号)
逻辑运算符 (初中学的真假命题)
赋值运算符 (大学学的赋值运算)

二 . 左值和右值

此概念针对赋值操作符,形式如下:
左值 = 右值
首先记住一点:左边的那个表达式可以放到右边变成右值,但是右边的表达式不能放到左边

所以下面就讲怎么理解 “右边的表达式不能放到左边”,
左值表示的是可以存储结果的地点(注意这里不是指地址),想象一下下面这个图
在这里插入图片描述
任何一个存储在内存中的值都有一个地址和值,
有一个框框里面放着地址,简称 “地址框框”
有一个框框里面放着值,简称 “值框框”

因此可以把
左值 = 右值 理解成 框框 <-- 值
即我要把一个值放到这个框框里面去

当表达式作为右值时,所表示的内容是value的时候,那么表达式作为左值时,表示的内容是值框框—合法
当表达式作为右值时,所表示的内容是adress的时候,那么表达式作为左值时,表示的内容是地址框框----非法
当表达式作为右值时,所表示的内容是没有框框去存储它的结果的时候—非法

如何理解“地址框框” 作为左值时是非法的

可以想象,一个变量被加载到内存中的时候,是先分配地址,再往地址里面分配值的
地址框框的存在说明,这个框框里面没有了地址,这个地址需要硬件去分配,而不是等着程序去分配

例如:

char ch = ‘a’;
char *cp = &ch;

&ch

作为右值表示的是字符变量ch的地址,那么表达式作为左值时是地址框框----非法

cp

作为右值表示的是指针变量cp的值(不过这个值是别人的地址),那么表达式作为左值时是值框框—合法(而且位于它右侧的右值是一个新诞生的值,将要替换这个值框框里的原始的值)

&CP

作为右值表示的是指针变量cp的地址,那么表达式作为左值时是地址框框—非法

*cp

作为右值表示的是 取指针变量cp所值的地址的值,那么表达式作为左值时是值框框—合法

*cp + 1

这是一个算数运算结果,
《C和指针这样解释它》:这个表达式最终的存储位置没有清晰定义。 如何理解这句话?
反向思考,如果存储位置有清晰定义,那么它会是这样写的 ch2 = *cp + 1,很明显,这个结果的存储在ch2里面了。

所以这个表达式没有框框去存储它的结果

*(cp + 1)

作为右值表示的是 cp的地址 + 1, 然后取这个地址所表达的值,那么表达式作为左值时是值框框—合法

++cp

产生了副本—非法

++cp

同上 ++cp

*++cp

作为右值表示的是cp所指的变量的地址自加,得到的是一个地址,然后取这个地址的值,那么表达式作为左值时是值框框—合法
先产生一个副本,再根据这个副本来取某个变量的值

*cp++

同上 *++cp

++*cp

根据运算顺序,最后一步执行了++,产生了副本—非法

cp) ++
++
++cp
++*cp++
同上

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值