C语言规定了运算符的优先级和结合性。在表达式求值时,先按运算符的优先级别高低次序执行,例如先乘除后加减。如表达式a-b*c
,b的左侧为减号,右侧为乘号,而乘号优先于减号,因此这个表达式相当于a-(b*c)
,如果在一个运算对象两侧的运算符的优先级别相同,例如a-b+c
,则按照规定的结合方向处理。
C语言还规定了各种运算符的结合方向,众所周知的是,算术运算符的结合方式为“自左向右”,即先左后右,因此b先与减号结合,执行a-b的运算,再执行加c的运算。“自左至右的结合方向”,又称左结合性
,即运算对象先与左面的运算符结合。在C语言钟有些运算符的结合方向是“自左至右”,即右结合性
。 如赋值语句:
a=b=c=d;
其执行顺序是自右向左的,先把d的值赋给c,再把c的值赋给b,然后把b的值赋给a,假如d的值是3,则最后的a,b,c,d的值都为3 。 这显然是右结合性,例如变量c的两侧都有赋值运算符,优先级相同,按右结合性,先和右侧的赋值运算符结合,执行c=d的操作,其余类推。++与- -运算符的结合方式也是自右至左的。如有a=-i++
,变量i的两侧的运算符-和++的优先级相同,那么 i 先是和左面的负号结合
注: 是将其理解为 (-i)++
还是和右边的++结合成-(i++)
呢?
按照右结合性来看,是后者才对。为了避免混淆,可以将不必要的括号加上,便于理解。