@CrazyHenry
2018-01-28T15:05:47.000000Z
字数 1144
阅读 1082
ccccC++Primer
- Author:李英民 | Henry
- E-mail: li
_
yingmin@
outlookdot
com- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!
运算符有两个重要因素:优先级和结合律
表达式的求值顺序:
优先级和结合律,在C++课本上已经讲得很详细了!但是,究竟是什么因素决定了一个表达式的求值顺序没有说得很清楚。以几个列子来说明这个问题:
int i = 2;
cout<<i<<++i<<endl;
首先,因为++的优先级高于<<,所以,++i中的i会与++结合到一起;
其次,3个<<的优先级一样,因为<<满足左结合律,所以cout和第一个i先与第一个<<结合(越靠左的<<优先选择结合对象);然后,第二个<<只能与cout<<i
的返回值作为左侧对象,右侧对象是++i;
现在问题来了,目前这个表达式所有的运算对象包括i
,++i
,cout<<i
,cout<<i<<++i
,由于没有规定运算对象的求值顺序,那么究竟应该谁先计算,为什么会从左到右依次输出?
因为i和++i之间没有任何运算对象的制约性,所以这两个运算对象的求值顺序不一定!但是,如果要计算第二个<<,就必须先计算cout<<i
,这时才会有返回的cout对象,所以,cout<<i
会早于cout<<++i
执行!
int i =2;
cout<<i + ++i<<endl;
因为++的优先级高,所以++i会结合到一起,成为+的右侧运算对象。
该表达式的运算对象有i和++i,因为两者没有制约性,所以求值顺序任意。结果可能先计算i得2,再计算++i得3,结果为5;也可能先计算++i得3,再计算i得3,输出6。
int i =2;
cout<<i + ++i * i/i<<endl;
必须先算++i *i/i之后才能算加法,必须先算++i *i才能算/i。但是这里的所有的i都是不确定的值,不知道先算i还是++i。
任何没有运算对象的制约性的运算对象,其求值顺序都是任意的!
int i = 4;
cout<< i++ + (++i)*(i*i)/(i--);
i++
,++i
,i*i
,i--
,(++i)*(i*i)
, (++i)*(i*i)/(i--)
都是运算对象。比如说,++i
,i*i
是没有制约关系的,所以,他们的计算顺序随机。但是,(++i)*(i*i)
必须先算,才能计算(++i)*(i*i)/(i--)
,而且(++i)*(i*i)
与i--
也没有制约关系。