如何查看网站开发源码,网站设计制作一般多少钱,无货源电商怎么做新手入门,新密市城乡建设局网站优先级、结合性这些概念在初学的时候并没有放在心上#xff0c;今天又碰到这个问题#xff0c;查了不少资料#xff0c;再次做个总结。在标准C语言的文档里#xff0c;对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是#xff1a;它是仲裁者#xff0c;在几个…优先级、结合性这些概念在初学的时候并没有放在心上今天又碰到这个问题查了不少资料再次做个总结。在标准C语言的文档里对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是它是仲裁者在几个操作符具有相同的优先级时决定先执行哪一个。每个操作符拥有某一级别的优先级同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如在表达式a*bc中乘法运算的优先级高于加法运算符的优先级所以先执行乘法a*b而不是加法bc。但是许多操作符的优先级都是相同的。这时操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符结合性就起仲裁的作用由它决定哪个操作符先执行。像下面这个表达式int a,b1,c2;abc;我们发现这个表达式只有赋值符这样优先级就无法帮助我们决定哪个操作先执行是先执行bc呢?还是先执行ab。如果按前者a结果为2如果按后者a的结果为1。所有的赋值符(包括复合赋值)都具有右结合性就是在表达式中最右边的操作最先执行然后从右到左依次执行。这样c先赋值给b然后b在赋值给a最终a的值是2。类似地具有左结合性的操作符(如位操作符“”和“|”)则是从左至右依次执行。结合性只用于表达式中出现两个以上相同优先级的操作符的情况用于消除歧义。事实上你会注意到所有优先级相同的操作符它们的结合性也相同。这是必须如此的否则结合性依然无法消除歧义如果在计算表达式的值时需要考虑结合性那么最好把这个表达式一分为二或者使用括号。例abcd是右结合的所以先计算(bcd)然后再赋值给a是左结合的所以先计算(bc)然后再计算(bc)dC语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符()和条件运算符。其它都是左结合性。在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的1 和 || 规定从左到右求值并且在能确定整个表达式的值的时候就会停止也就是常说的短路。2条件表达式的求值顺序是这样规定的test ? exp1exp2;条件测试部分test非零表达式exp1被求值否则表达式exp2被求值并且保证exp1和exp2两者之中只有一个被求值。3逗号运算符的求值顺序是从左到右顺序求值并且整个表达式的值等于最后一个表达式的值注意逗号,还可以作为函数参数的分隔符变量定义的分隔符等这时候表达式的求值顺序是没有规定的判断表达式计算顺序时先按优先级高的先计算优先级低的后计算当优先级相同时再按结合性或从左至右顺序计算或从右至左顺序计算。说完了优先级和结合性下面说说自增运算符首先明白自增运算符的两种使用情况(1)、单独使用i或者1这种情况下两者是没有区别的i的值都会增加1(2)、在表达式中使用a i此时先取i的值赋给a然后i的值自增相当于a i;ii1a i此时先让i自增然后将自增后的值赋给a相当于i i 1;a i明白了自增的这两种情况然后再来看看自增和结合性的混合情况*p (*p) *(p)三者的区别对于*p首先*和的优先级相同然后看他们的结合性由于优先级相同那么他们的结合性必然也相同都是右结合(从右至左)。那么*p 就相当于*(p)即根据右结合p与先结合形成(p)然后再与*结合。需要注意的一点(本文想着重说明的一点)虽然*(p)中p被放在了括号内此时应根据自增运算符的两种情况来考虑(而不需要考虑结合性了此时与结合性已经无关)显然这是上述的第二种情况即在表达式中使用自增。所以是先取p的值与*结合然后p值再自增相当于*p,p千万不要被括号迷惑认为括号中的东西先运算。明白了上面一点则对于*(p)就很好理解p先自增然后与*结合。对于下面的例子也不难理解例一char q[5] am;char *p q;那么(*p)后p就变成了bm;因为是进行对其首元素进行加1运算*(p)后p就变成了m因为完成取值运算后p指向下一个元素即m*p与*(p)一样。如果只是征对这3个语句赋值给其他变量的话3个的结果都是a在这里。char o (*p);char m *(p);char n *p;都是a。例二int i 0,a,b;a (i)(i)(i);b (i)(i)(i);cout输出结果(gcc编译器)0 16 6解释这里特别注明是gcc编译器在其他编译器下的值可能不同。对于int a(i)(i)(i);先取出i值进行加运算然后再执行i的三次自增 在其他编译器下(如tc3.0)可能是0123对于int b(i)(i)(i);每次i先自增然后参与运算所以是45616.