栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

公众号:嵌入式不难

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



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

分析
  1. 初始时char *p=NULL, *p2=NULL;对应了printf("-1-的打印
  2. 执行(p2=p=buf, printf("-2- p=%pt-p2=%pn", p, p2), p2=NULL),这里根据优先级会先计算()表达式,而这里最外层只有一个(),所以不用多个考虑()的结合性,拆解()里的内容,为一个,号运算符,我们可以直接断定()的最终结果为最右边的表达式值p2=NULL,p2=NULL是一个=号表达式,根据=号表达式,会从右至左结合,所以整个=号表达式的值为左值,也就是p2,从这里我们就已经可以得到最外层()表达式的值一定是p2的值,也就是NULL,这也推导出了(p)=(nil)的打印结果
  3. 执行(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-的打印结果
  4. 执行p = (NULL, buf);,p2 = NULL, buf;这两个结果不同在于,号运算符的优先级低于=号运算符,所以p = (NULL, buf);的p得到的是()运算符的值,即,的最右表达式的值,而p2 = NULL, buf;的p2得到的是=号表达式的值,即NULL,这就是printf("-4-的打印结果
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号