C/c++中运算符的优先级,运算符的结合性详解

  

<强>一。运算符的优先级

  

,,,在c++底漆一书中,对于运算符的优先级是这样描述的:

  

,

  

,,,意识是说优先级规定操作数的结合方式,但并未说明操作数的计算顺序。举个例子:

  

,,,6 + 3 * 4 + 2

  

,,,如果直接按照从左到右的计算次序得到的结果是:38岁但是在C/c++中它的值为20。

  

,,,因为乘法运算符的优先级高于加法的优先级,因此3是和4分组到一起的,并不是6与3进行分组。这就是运算符优先级的含义。

  

<强>二。运算符的结合性

  

  

,,,结合性规定了具有相同优先级的运算符如何进行分组。

  

,,,举个例子:

  

,,,a=b=c=d;

  

,,,由于该表达式中有多个赋值运算符,到底是如何进行分组的,此时就要看赋值运算符的结合性了。因为赋值运算符是右结合性,因此该表达式等同于(a=(b=(c=d))),而不是(=(b=c)=d)这样进行分组的。

  

,,,同理如m=a + b + c;

  

,,等同于m=(a + b) + c;而不是m=a + (b + c);

  

<强>三。操作数的求值顺序

  

,,在C/c++中规定了所有运算符的优先级以及结合性,但是并不是所有的运算符都被规定了操作数的计算次序。在C/c++中只有4个运算符被规定了操作数的计算次序,它们是,,,| |,逗号运算符(,),条件运算符(& # 63;:)。

  

,,如m=f1 () + f2 ();

  

,,在这里是先调用f1(),还是先调用f2() & # 63;不清楚,不同的编译器有不同的调用顺序,甚至相同的编译器不同的版本会有不同的调用顺序。只要最终结果与调用次序无关,这个语句就是正确的。这里要分清楚操作数的求值顺序和运算符的结合性这两个概念,可能有时候会这样去理解,因为加法操作符的结合性是左结合性,因此先调用f1(),再调用f2(),这种理解是不正确的。结合性是确定操作符的对象,并不是操作数的求值顺序。

  

,,,同理2 + 3 * 4 + 5;

  

,,,它的结合性是(2 +(3 * 4))+ 5,但是不代表3 * 4是最先计算的,它的计算次序是未知的,未定义的。

  

,,,比如3 * 4→2 + 3 * 4→2 + 3 * 4 + 5

  

,,,以及2→3 * 4→2 + 3 * 4→2 + 3 * 4 + 5和5→3 * 4→2 + 3 * 4→2 + 3 * 4 + 5这些次序都是有可能的。虽然它们的计算次序不同,但是对最终结果是没有影响的。

  

,,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

C/c++中运算符的优先级,运算符的结合性详解