公众号:嵌入式不难
本文仅供参考学习,如有错误之处,欢迎留言指正。
结论
()
具有最高优先级,相等优先级的多个表达式时,()
具有从左至右的结合性,即会先计算最左边的表达式,然后依次向右计算表达式,
运算符的结合性为从左至右,即运算多个,
串联的表达式时会先计算最左边的表达式,然后依次向右计算表达式,,
表达式最后的值取最右边表达式的值,注意,
运算符拥有最低的运算优先级,比=
运算符还要低。=
号运算符的结合性为从右至左,在具有多个相等优先级的表达式时,会先计算最右边的表达式,然后依次向左计算表达式,最终取最后一个表达式的左值作为整个=
号运算符的最终值
实验
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char *p=NULL, *p2=NULL;
char buf[] = "hahaha";
printf("-1- p=%p\t\t-p2=%p\n", p, p2);
printf("(p)=%p\n", (p2=p=buf, printf("-2- p=%p\t-p2=%p\n", p, p2), p2=NULL));
printf("-3- p=%p\t-p2=%p\n", p, p2);
p = (NULL, buf);
p2 = NULL, buf;
printf("-4- p=%p\t-p2=%p\n", p, p2);
return 0;
}
/* 实验结果
-1- p=(nil) -p2=(nil)
-2- p=0x7ffc61385710 -p2=0x7ffc61385710
(p)=(nil)
-3- p=0x7ffc61385710 -p2=(nil)
-4- p=0x7ffc61385710 -p2=(nil)
*/
分析
- 初始时
char *p=NULL, *p2=NULL;
对应了printf("-1-
的打印 - 执行
(p2=p=buf, printf("-2- p=%p\t-p2=%p\n", p, p2), p2=NULL)
,这里根据优先级会先计算()
表达式,而这里最外层只有一个()
,所以不用多个考虑()
的结合性,拆解()
里的内容,为一个,
号运算符,我们可以直接断定()
的最终结果为最右边的表达式值p2=NULL
,p2=NULL
是一个=
号表达式,根据=
号表达式,会从右至左结合,所以整个=
号表达式的值为左值,也就是p2
,从这里我们就已经可以得到最外层()
表达式的值一定是p2
的值,也就是NULL
,这也推导出了(p)=(nil)
的打印结果 - 执行
(p2=p=buf, printf("-2- p=%p\t-p2=%p\n", p, p2), p2=NULL)
,根据,
号运算符的结合性,会从左至右结合,即会先执行p2=p=buf
,再执行printf("-2- p=%p\t-p2=%p\n", p, p2)
,最后执行p2=NULL
,这里的p2=p=buf
表达式出现了两个=
,根据=
号从右至左的结合性,会先执行p=buf
,再执行p2=p
,所以最终是p2
,p
,buf
的值相等。所以第二个执行printf("-2- p=%p\t-p2=%p\n", p, p2)
时可以看到执行结果是相等的,当最后执行p2=NULL
时,p2
变成了NULL
,所以这行语句执行完毕后p为buf
,p2为NULL
,这就是printf("-3-
的打印结果 - 执行
p = (NULL, buf);
,p2 = NULL, buf;
这两个结果不同在于,
号运算符的优先级低于=
号运算符,所以p = (NULL, buf);
的p
得到的是()
运算符的值,即,
的最右表达式的值,而p2 = NULL, buf;
的p2
得到的是=
号表达式的值,即NULL
,这就是printf("-4-
的打印结果