《C和指针 第5章 操作符和表达式》
本章讲了两件事:
- 掌握操作符的优先级去计算表达式的值
- 掌握左值和右值
文章目录
一、操作符的优先级
( ) > ( ) > [ ] > . > ->
单目运算符
算数运算符 (小学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++
同上