当前位置: 首页 > news >正文

无锡建设银行官网招聘网站学网页设计的课程

无锡建设银行官网招聘网站,学网页设计的课程,网页版微信怎么退出,seo优化工具软件c语言中运算符的优先级和结合性常常被人混淆一谈#xff0c;本文目的在于简单谈谈两者的区别。本文举几个简单的例子说明#xff0c;这些运算符也特别常用。 首先要明白的是#xff1a;优先级决定表达式中各种不同的运算符起作用的优先次序#xff1b;而结合性则在相邻的运…c语言中运算符的优先级和结合性常常被人混淆一谈本文目的在于简单谈谈两者的区别。本文举几个简单的例子说明这些运算符也特别常用。   首先要明白的是优先级决定表达式中各种不同的运算符起作用的优先次序而结合性则在相邻的运算符的具有同等优先级时决定表达式的结合方向。   [赋值运算符“”] 对于赋值运算符来说常会用到的是连续赋值的表达式。比如“abc”。 这里的变量b的两边都是赋值运算优先级当然是相同的那么应该怎么理解这个表达式呢我们知道赋值表达式具有“向右结合”的特性这就表示这个表达式的语意结构是“a(bc)”而不是“(ab)c”。这意味着首先完成c向b赋值然后将表达式“bc”的值再赋给a。这个区别特别重要因为可能会涉及到强制类型转换、初值不同等情况所以不同的理解得到的答案是不一样的。 这里我们再来看一般的二元运算符为了说明方便我们现在不妨记作。如果它是“向左结合”的那么表达式“xyz”表达的意思就应该是“(xy)z”如果是“向右结合”的那么应该表达的是“x(yz)”。这里值得注意的是这里的二元运算符可以不是同一种运算符只要有同等优先级以上结论就是适用的。比如“a*b/c”表达的就是“(a*b)/c”。   [自增运算符“”与解引用运算符“*”] 这一节我们以例子“*p”引出。下面这个据说是烂大街的实现strcpy函数的示例代码 char* strcpy( char* dest, const char* src ){char*p dest;while(*p *src);return dest; }   我们很快发现理解这一小段程序的关键就在于怎么理解这个循环条件“*p”的含义。 首先解引用运算符“*”的优先级低于后面的自增运算符“”所以这个表达式在语义上等价于“*(p)”而不是“(*p)”。这里从语义上来说括号是多余的当然从程序的可读性来说建议还是加上括号。 还有一个问题常让人糊涂就是自增运算符“”的语义。很多书上写“后自增是先取值后加1”。这样讲是没有错的但在一些特定的语境上容易让人无解比如上面这个while语句。 才开始学习的时候肯定有这样的疑惑当一个表达式同时包含自增、解引用、赋值且最终作为控制循环的条件的时候这里的“前取值”到底“先”到什么程度呢这时候我们需要查阅一下c语言标准。以下摘自C99标准ISO/IEC 9899:19996.5.2.4-2The result of the postfix operator is the value of the operand. After the result is obtained, the value of the operand is incremented. …… The side effect of updating the stored value of the operand shall occur between the previous and the next sequence point. 也就是说后自增表达式的结果值就是被自增之前的那个值然后这个结果值被确定之后操作数的值会被自增。而这种“自增”的副作用会在上一个“序列点”跟下一个“序列点”之间完成。本文不打算详细讨论序列点。有兴趣的读者可以阅读一下标准。需要指出的是赋值运算在C语言中并不是一个序列点所以上面的while语句中src的自增效果无需是在赋值之前完成。但while的整个控制表达式的结束却是一个序列点。 我们可以这样解读“while(*p*src);”首先while的条件变量是一个赋值表达式左侧操作数是“*p”右侧操作数是“*src”整个表达式的值将是赋值完成后左侧项的值。而左右两侧是对两个后自增表达式解引用由前面的说明可以知道解引用作用于整个后自增表达式而不仅仅作用于p或src本身那么根据上面引用的标准他们“取用”的人别是指针p和src的当前值。而自增的副作用只需要在下一个序列点之前完成即可。 简单地说编译器分别取得指针p和src的当前值基于这个值完成“*src”向“*p”的赋值同时这个赋值结果也将作为整个赋值表达式的值用来决定是否退出循环。然后在整个表达式结束时的某一个时刻在不影响之前叙述的前提下p和src人别加1。 也就是说我们基于p和src的旧值所进行赋值和循环条件判断然后完成p和src的自增。 另外这里有关于后自增后自减运算的另外两种表述虽然与c语言标准上的说法并不完全一致但在最终的语义效果如出一辙 1后自增“x”相当于一个逗号表达式“tmpx,x,tmp” 2后自增就是把操作数加1然后返回加1之前的值作为整个表达式的值。 这里值得一提的是在c语言中需要重载后自增运算符时往往采用的机制就是基于这两种说法。 再举一个据说还是烂大街的实现 size_t strlen(const char* str){const char* p str;while(*p);return p - str - 1; }   我们发现函数最后有一个减1的操作这是因为当循环条件不满足而退出循环时会在“正式”退出之前后自增运算符“”加1的副作用。可以这么理解所谓“退出循环”指的是“不再执行循环体”但控制表达式并不是循环体的一部分它的所有副作用在整个表达式结束之前都会生效。 这一节的最后重要的事情再说一遍*p就是*(p)两者除了可读性以外没有任何区别。那种认为加上括号就可以实现先加1再解引用的想法是错误的要想实现那样的效果可以用“*p”。   [三目元算符“ ? : ”] 先给出一个例子 int x 3; int y 2; int z x y ? 100 : y 2 ? 20 : 30;   我们会关心z的值是多少。 这里是两个三目运算符的嵌套有“向右结合”的特性。许多人认为基于这个性质右侧的内层条件运算“y2?20:30”应该先求值。即y先加1大于2的条件成立从而使这个表达式取得结果“20”然后求整个表达式的值这时y的值是3所以“xy”为假故整个结果是刚刚求得的20。 然而事实并不是这样…… 这种思路是错误的 这里的错误在于把优先级、结合性与求值次序完全混为一谈。 首先在大多数情况下c语言对表达式中各个子表达式的求值次序并没有严格的规定其次即使是求值次序确定的场合也是要先确定了表达式的语意结构在获得确定的语义之后才谈得上“求值次序”。 对于上面的例子条件运算符“向右结合”这一个特性并没有决定内层的条件表达式先被求值而是决定了上面表达式的语意结构等价于“xy?100:(y2?20:30)”而不是“(xy?100:y)2?20:30”。这才是“向右结合”的真正含义。 编译器确定了表达式的结构之后就可以准确地为它产生运行时的行为了。条件运算符是c语言中为数不多的对求值次序有着明确规定的运算符之一另外还有三个分别是逻辑与“”、逻辑或“||”和逗号运算符“,”。 c语言规定条件表达式首先对条件部分求值如果条件部分为真则对问号之后冒号之前的部分求值表达式2并将求得的结果作为整个表达式的值否则对冒号之后的部分表达式3求值并作为整个表达式的值。 因此对于表达式“xy?100:(y2?20:30)”首先看x大于y是否成立在本例中它是成立的因此整个表达式的值为100。也就是说表达式3根本就不会被执行其中包含的自增运算符的副作用也不会生效。   [最后再说几句] 本文主要阐述了以下几点 1优先级决定表达式中各种不同的运算符起作用的优先次序而结合性则在相邻的两个运算符的具有同等优先级时决定表达式的结合方向2后自增后自减从语义效果上可以理解为在做完自增自减之后返回自增自减之前的值作为整个表达式的结果值3准确来讲优先级和结合性确定了表达式的语义结构不能跟求值次序混为一谈。   PS. 1、本文参考博文http://blog.csdn.net/steedhorse/article/details/5903974 2、维基百科上有C/C语言运算符表http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B 3、曾在新浪微博上见benbearchen提到有的公司在代码规范中要求如果while的循环体为空语句那么必需以continue语句代替不准只写一个分号。我本人很赞成这个。上面strcpy和strlen的两个例子之所以没那么用只是为了“随大流”因为这两个函数的示例实现许多人、许多书上都这么写。  转载于:https://www.cnblogs.com/CQBZOIer-zyy/p/5303741.html
http://www.sadfv.cn/news/86577/

相关文章:

  • 蚌埠网站优化制作公司万能搜索
  • 怎样做艾条艾柱网站建站行业span分析
  • 南昌网站建设公司渠道优惠券网站怎么做代理
  • 郑州做网站锐金寨县重点工程建设管理局网站
  • 怎么做谷歌收录的网站吗网站打开显示建设中
  • 昌平网站建设浩森宇特建站公司如何在抖音平台开店
  • 秦皇岛建设工程信息网站建设网站要多长时间
  • 国外网站推广软件接工程平台
  • 返利网站做淘宝台州平台网站建设
  • vps没问题访问不了网站高邮城乡建设局 网站
  • python 做网站 用哪个框架好南乐网站建设价格
  • 自己网站如何做关键词网站设计和备案
  • 安康 住房城乡建设部网站邵阳市建设局网站首页
  • .net 接单网站有哪些封丘县建设银行网站
  • 张槎杨和网站建设帮做ppt的网站
  • 六安网站开发专门做生鲜的网站
  • 温州网站设计联系亿企邦wordpress 三合一
  • 惠州网站制作软件wordpress the7 下载
  • 博客做资讯类网站武进区住房和城乡建设局网站
  • 网站访问量火车头wordpress 5.1发布模块
  • 邢台专业网站建设体育新闻最新消息乒乓球
  • 做公司网站需要备案吗网站 分析
  • app门户网站沧州网络营销推广方案
  • 企业网站建设案例哪个品牌好哪些网站可做矿机期货
  • 网站图片内容上海设计公司排名前十强20
  • 成都手机建站电脑手机网站首页
  • 网站推广过程叙述电商美工是做什么的
  • 久久租房网.net网站如何优化
  • 网站建设与管理大纲天津大邱庄网站建设公司
  • 烟台百度网站推广创建全国文明城市倡议书