C语言之C语言小括号表达式,C语言逗号运算符,C语言等号运算符

公众号:嵌入式不难

本文仅供参考学习,如有错误之处,欢迎留言指正。



结论

  • ()具有最高优先级,相等优先级的多个表达式时,()具有从左至右的结合性,即会先计算最左边的表达式,然后依次向右计算表达式
  • ,运算符的结合性为从左至右,即运算多个,串联的表达式时会先计算最左边的表达式,然后依次向右计算表达式,,表达式最后的值取最右边表达式的值,注意,运算符拥有最低的运算优先级,比=运算符还要低。
  • =号运算符的结合性为从右至左,在具有多个相等优先级的表达式时,会先计算最右边的表达式,然后依次向左计算表达式,最终取最后一个表达式的左值作为整个=号运算符的最终值

实验

#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)
*/
分析
  1. 初始时char *p=NULL, *p2=NULL;对应了printf("-1-的打印
  2. 执行(p2=p=buf, printf("-2- p=%p\t-p2=%p\n", p, p2), p2=NULL),这里根据优先级会先计算()表达式,而这里最外层只有一个(),所以不用多个考虑()的结合性,拆解()里的内容,为一个,号运算符,我们可以直接断定()的最终结果为最右边的表达式值p2=NULLp2=NULL是一个=号表达式,根据=号表达式,会从右至左结合,所以整个=号表达式的值为左值,也就是p2,从这里我们就已经可以得到最外层()表达式的值一定是p2的值,也就是NULL,这也推导出了(p)=(nil)的打印结果
  3. 执行(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为bufp2为NULL,这就是printf("-3-的打印结果
  4. 执行p = (NULL, buf);p2 = NULL, buf;这两个结果不同在于,号运算符的优先级低于=号运算符,所以p = (NULL, buf);p得到的是()运算符的值,即,的最右表达式的值,而p2 = NULL, buf;p2得到的是=号表达式的值,即NULL,这就是printf("-4-的打印结果
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值