精华内容
下载资源
问答
  • c语言的左结合性与右结合性

    万次阅读 多人点赞 2017-11-27 21:39:35
    右结合性,就是在表达式中最右边操作最先执行,然后从右到左依次执行 ...每个操作符拥有某一级别优先级,同时也拥有左结合性右结合性。优先级决定一个不含括号表达式中操作数之间“紧密”程度

    右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行
    左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行
    在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。
    每个操作符拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式中操作数之间的“紧密”程度。例如,在表达式ab+c中,乘法运算的优先级高于加法运算符的优先级,所以先执行乘法ab,而不是加法b+c。
    但是,许多操作符的优先级都是相同的。这时,操作符的结合性就开始发挥作用了。在表达式中如果有几个优先级相同的操作符,结合性就起仲裁的作用,由它决定哪个操作符先执行。像下面这个表达式:
    int a,b=1,c=2;
    a=b=c;
    我们发现,这个表达式只有赋值符,这样优秀级就无法帮助我们决定哪个操作先执行,是先执行b=c呢?还是先执行a=b。如果按前者,a=结果为2,如果按后者,a的结果为1。
    所有的赋值符(包括复合赋值)都具有右结合性,就是在表达式中最右边的操作最先执行,然后从右到左依次执行。这样,c先赋值给b,然后b在赋值给a,最终a的值是2。类似地,具有左结合性的操作符(如位操作符“&”和“|”)则是从左至右依次执行。
    结合性只用于表达式中出现两个以上相同优先级的操作符的情况,用于消除歧义。事实上你会注意到所有优先级相同的操作符,它们的结合性也相同。这是必须如此的,否则结合性依然无法消除歧义,如果在计算表达式的值时需要考虑结合性,那么最好把这个表达式一分为二或者使用括号。
    例:
    a=b+c+d
    =是右结合的,所以先计算(b+c+d),然后再赋值给a
    +是左结合的,所以先计算(b+c),然后再计算(b+c)+d
    C语言中具有右结合性的运算符包括所有单目运算符以及赋值运算符(=)和条件运算符。其它都是左结合性。
    在C语言中有少数运算符在C语言标准中是有规定表达式求值的顺序的:
    1:&& 和 || 规定从左到右求值,并且在能确定整个表达式的值的时候就会停止,也就是常说的短路。
    2:条件表达式的求值顺序是这样规定的:
    test ? exp1 : exp2;
    条件测试部分test非零,表达式exp1被求值,否则表达式exp2被求值,并且保证exp1和exp2两者之中只有一个被求值。
    3:逗号运算符的求值顺序是从左到右顺序求值,并且整个表达式的值等于最后一个表达式的值,注意逗号’,'还可以作为函数参数的分隔符,变量定义的分隔符等,这时候表达式的求值顺序是没有规定的!
    判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。

    转自:http://tieba.baidu.com/p/3781601455

    展开全文
  • 结合性 3.1 从:3个 2 单目运算符:- (类型) ++ -- * & ! ~ sizeof 13 三目运算符:条件运算符?: 14 赋值运算符:= /= *= %= += -= <<= >>= &= ^= |= 3.2 规律: 三目运算符,是从...

    前言

    一直想总结下C语言的优先级,好方便查询,那就总结下了。

    一 表

    在这里插入图片描述

    二 优先级

    算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。

    三 结合性

    3.1 从右到左:3个

    2 单目运算符- (类型) ++ -- * & ! ~ sizeof

    13 三目运算符:条件运算符?:

    14 赋值运算符= /= *= %= += -= <<= >>= &= ^= |=

    3.2 规律:

    三目运算符,是从右到左

    双目运算符,只有各种赋值运算符,是从右到左

    最后一个从右到左:单目运算符

    参考文献

    [1] C语言运算符优先级和结合性一览表 http://c.biancheng.net/view/161.html

    展开全文
  • C语言运算符的结合性

    千次阅读 2013-08-13 20:23:33
    C 语言其他高级语言相比, 一个显著特点就是其运算符特别... 大多数运算符结合方向是“自至右”, 即: 先后右, 例如a- b+c, b 两侧有- 和+两种运算符优先级相同, 按先右结合方向, b 先减号

          C 语言与其他高级语言相比, 一个显著的特点就是其运算符特别丰富, 共有34 种运算符。C 语言将这34 种运算符规定了不同的优先级别和结合性。当一个运算对象两侧的运算符优先级别相同时, 则按运算符的结合性来确定表达式的运算顺序。

          大多数运算符结合方向是“自左至右”, 即: 先左后右, 例如a- b+c, b 两侧有- 和+两种运算符的优先级相同, 按先左后右结合方向, b 先与减号结合, 执行a- b 的运算, 再执行加c 的运算。除了自左至右的结合性外, C 语言有三类运算符参与运算的结合方向是从右至左。即: 单目运算符, 条件运算符, 以及赋值运算符。关于结合性的概念在其他高级语言中是没有的, 这是C语言的特点之一,特别是从右至左结合性容易出错, 下面通过几个具体的运算符来剖析C 语言运算符的结合性。

           若a 是一个变量, 则++a 或a++和- - a 或a- - 分别称为前置加或后置加运算和前置减或后置减运算, 且++a 或a++等价于a=a+1, - - a 或a- - 等价于a=a- 1, 即都是使该变量的值增加1 或减少1。由此可知, 对一个变量实行前置或后置运算, 其运算结构是相同的, 但当它们与其他运算结合在一个表达式中时, 其运算值就不同了。前置运算是变量的值先加1 或减1, 然后将改变后的变量值参与其他运算, 如x=5; y=8; c=++x*y; 运算后, c 的值是48,x 的值是6,y 的值是8。而后置运算是变量的值先参与有关运算, 然后将变量本身的值加1 减1, 即参加运算的是该变量变化前的值。如x=5; y=8; c=x++*y;运算后, c 的值是40,x 的值是6, y 的值是8。值得注意的是, 前置、后置运算只能用于变量, 不能用于常量和表达式, 且结合方向是从右至左。如当i=6 时, 求- i++的值和i 的值。由于“- ”(负号) “++”为同一个优先级, 故应理解为- (i++), 又因是后置加, 所以先有- i++的值为- 6, 然后i 增值1 为7, 即i=7。

    例1

    main()
    {int a=3,b=5,c;
    c=a*b+++b;
    printf ( “c=%d”, c);}

         要得出c 的值, 首先要搞清+++的含义。++运算符的结合方向是自右向左的, 如果将表达式理解为:c=a*b+(++b);实际上C 编译器将表达式处理为:c=(a*b++)+b, 因为C 编译器总是从左至右尽可能多地将若干个字符组成一个运算符, 如i+++j 等价于(i++)+j。接下来是解决a*b++的问题, 因为++运算符的运算对象只能是整型变量而不能是表达式或常数, 所以a*b++显然是a*(b++)而非(a*b)++, 因此整个表达式就是c=(a*(b++))+b。

    例2 

    main()
    { int i=1,j;
    j=i+++i+++i++;
    printf( “i=%d,j=%d\n”, i,j);}
    例3 main()
    { int i=1,m;
    m=++i+++i+++i;
    printf( “i=%d,m=%d\n”, i,m);}

         j 和m 的值均由表达式求得, 并且这两个表达式均由自增运算符、加法运算符和赋值运算符组成。那么, 它们的值到底为多少呢? j=1+1+1=3 还是j=1+2+3=6? m=2+3+4=9 还是m=4+4+4=12?上机运行结果为: i=4,j=3,m=12。

         分析: 运算符“++”,“+”和“=”的优先级是递减的, 在计算时,先进行自增运算, 再进行加法运算, 最后是赋值运算。而自增运算又根据“i++”和“++i”的不同定义得到不同的值。i+++i+++i++先将i 原值(1)取出, 作为表达式中i 的值进行加法运算得到3, 然后再实现三次自加; ++i+++i+++i 自加是在整个表达式求解之前开始,也即先对表达式扫描, 对i 进行三次自加得到4, 再进行加法运算得到12。

        C 语言中运算符的两种不同的结合方向是其特有的, 理解结合方向有助于理解表达式的运算顺序。当看到一个复杂的C 语言表达式时, 首先应按优先级进行运算, 然后在同一优先级中按结合方向进行运算。

     

    展开全文
  • C语言规定了运算符优先级和结合性。在表达式求值时,先按运算符优先级别...“自左至右结合方向”,又称左结合性,即运算对象先左面运算符结合。在C语言钟有些运算符结合方向是“自左至右”,即右结合性
  • 结合性左结合是从左到右依次执行,右结合是从右到左依次执行。 优先级 运算符 名称或作用 运算类型 结合方向 特点 1 () [] -> . 小括号运算符 ...

    结合性:左结合是从左到右依次执行,右结合是从右到左依次执行。

     

    优先级

    运算符

    名称或作用

    运算类型

    结合方向

    特点

    1

    ()

    []

    ->

    .

    小括号运算符

    下标运算符

    指向结构成员运算符

    结构成员运算符

     

    左结合

     

    2

    !

    ~

    ++,--

    -

    (类型)

    *,&

    sizeof

    逻辑非运算符

    按位取反运算符

    自增/减运算符

    负号运算符

    类型转换运算符

    指针/取地址运算符

    求类型长度运算符

    单目运算

    右结合

     

    3

    *,/,%

    乘法/除法/求余运算符

    双目运算、算术运算

    左结合

    乘除取余优先于加减

    4

    +,-

    加法/减法运算符

    双目运算、算术运算

    左结合

    5

    <<,>>

    左移/右移运算符

    双目运算、位运算

    左结合

    位移低于算术运算

    6

    <,<=,>,>=

    小于/小于等于/大于/大于等于

    双目运算、关系运算

    左结合

    大小比较优先于等于比较

    7

    ==,!=

    判等/判不等运算符

    双目运算

    左结合

    8

    &

    按位与

    双目运算、位运算

    左结合

     

    9

    ^

    按位异或

    双目运算、位运算

    左结合

     

    10

    |

    按位或

    双目运算、位运算

    左结合

     

    11

    &&

    逻辑与

    双目运算、逻辑运算

    左结合

    且的优先级高于或

    12

    ||

    逻辑或

    双目运算、逻辑运算

    左结合

    13

    ?:

    条件运算符

    三目运算

    右结合

     

    14

    =,+=,-=,*=,/=,%=

    >>=,<<=,&=,^=,|=

    赋值运算符

    双目运算

    右结合

     

    15

    ,

    逗号运算符(顺序求值运算符)

     

    左结合

     

    转载于:https://www.cnblogs.com/sandychn/p/8395451.html

    展开全文
  • 大多数运算符结合方向是“自至右”, 即: 先后右, 例如a- b+c, b 两侧有- 和+两种运算符优先级相同, 按先右结合方向, b 先减号结合, 执行a- b 运算, 再执行加c 运算。除了自至右的结合性外, C 语言...
  • 自左至右的结合方向,称为左结合性。反之,称为右结合性。 结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外, 其它运算符都是左结合性。 (2)表达式求值 1)按运算符的优先级高低...
  • C语言之优先级、结合性与自增运算

    千次阅读 2016-08-18 21:08:53
    优先级、结合性这些概念在初学时候并没有放在心上,今天又碰到这...每个操作符拥有某一级别优先级,同时也拥有左结合性右结合性。优先级决定一个不含括号表达式中操作数之间“紧密”程度。例如,在表达式a...
  • c语言结合性问题

    千次阅读 2019-04-08 15:41:47
    大多数运算符结合方向是“自至右”, 即: 先后右, 例如a- b+c, b 两侧有- 和+两种运算符优先级相同, 按先右结合方向, b 先减号结合, 执行a- b 运算, 再执行加c 运算。 除了自至右的结合性外, C ...
  • C语言运算符及优先级与结合性 运算符 C语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符等类型。 1、算术运算符 +、—、*、/、%、++、–共7个 2...
  • c语言运算符及结合性

    2011-12-04 11:38:31
    C运算符优先级与结合 优先级 运算符 含义 参与运算对象数目 结合方向  1 ( ) [ ] -> . 圆括号运算符 下标运算符 指向结构体成员运算符 结构体成员...
  • http://www.xfsq.net/thread-15301-1-1.html 运算符的结合性指同一优先级运算符在表达式中操作组织方向, 即: 当一个运算对象两侧运算符优先级别相同时, 运算对象运算符结合顺序, C 语言规定了各种运算符...
  • 优先级 运算符 含义 运算对象个数 结合方向 1 ( ) ... 自 2 ! ~ ++ - - -...
  • 而a+b+c则需要进行结合性考虑了,如果+为左结合性,那么应该理解为:(a+b)+c,如果+为右结合性,那么应该理解为a+(b+c),当然了,我们已经知道+为左结合性了。  对于?:,在C中它优先级相同只有它自己,因此...
  • 每个操作符拥有某一级别优先级,同时也拥有左结合性右结合性。优先级决定一个不含括号表达式中操作数之间“紧密”程度。例如,在表达式a*b+c中,乘法运算优先级高于加法运算符优先级,所以先执行乘法a*b...
  • 今天闲来无事做,列个表比较一下JavaC的运算符及结合性的差别: 其中 instanceof作用是判断对象是否为某个类或接口类型 >>> 无符号的右移 > 有符号的左右移 然后是C语言的: 由上图可知: ...
  • 细说c/c++中 运算符 左结合与右结合

    千次阅读 2017-07-09 11:21:55
    右结合性,就是在表达式中最右边操作最先执行,然后从右到左依次执行 ...每个操作符拥有某一级别优先级,同时也拥有左结合性右结合性。优先级决定一个不含括号表达式中操作数之间“紧密”程
  • C语言中,运算符运算... C语言中各运算符结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符结合性是自左至右,即先左后右。如有表达式x-y+z则y应先"-"号结合, 执行x-y运算,然后
  • C语言中各运算符结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符结合性是自左至右,即先左后右。如有表达式x-y+z则y应先“-”号结合, 执行x-y运算,然后再执行+z运算。这种自...
  • C语言的本质(7)——C语言运算符大全C语言的结合方向 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式 x-y+z则 y 应先...
  • 在表达式中, 各运算量参与运算先后顺序不仅要遵守运算符优先级别规定,还要受运算符结合性的制约,以便确定是自左向进行运算还是自进行运算。这种结合性是其它高级语言运算符所没有,在某种程度上...
  •  结合性:C语言中结合性有两种,左结合性  右结合性;  左结合性:该操作数先左边运算符相结合;  右结合性:该操作数先右边运算符相结合。 背记运算符优先级口诀:   括号一,单
  •  赋值运算符的结合性为从;  所以a=b=c;相当于a=(b=c);  C语言同大多数语言一样没有指定同一运算符对多个操作数计算顺序(&&、||、?:和,操作符除外)  以下内容...
  • C语言运算符

    2014-09-07 17:20:24
    1、运算符的基本概念 ...运算符的结合性:C语言的运算符结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。 运算符的优先级:C语言运算符的优先级分为15个级别,1级最高,15级最低,优先

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 141
精华内容 56
关键字:

c语言的左结合性与右结合性

c语言 订阅