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



