[关闭]
@CrazyHenry 2018-01-28T15:05:47.000000Z 字数 1144 阅读 1082

4.x 运算符和运算对象的关系

ccccC++Primer


运算符有两个重要因素:优先级和结合律
表达式的求值顺序:

优先级和结合律,在C++课本上已经讲得很详细了!但是,究竟是什么因素决定了一个表达式的求值顺序没有说得很清楚。以几个列子来说明这个问题:

que1

  1. int i = 2;
  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执行!

que2

  1. int i =2;
  2. cout<<i + ++i<<endl;

因为++的优先级高,所以++i会结合到一起,成为+的右侧运算对象。
该表达式的运算对象有i和++i,因为两者没有制约性,所以求值顺序任意。结果可能先计算i得2,再计算++i得3,结果为5;也可能先计算++i得3,再计算i得3,输出6。

que3

  1. int i =2;
  2. cout<<i + ++i * i/i<<endl;

必须先算++i *i/i之后才能算加法,必须先算++i *i才能算/i。但是这里的所有的i都是不确定的值,不知道先算i还是++i。

que4

任何没有运算对象的制约性的运算对象,其求值顺序都是任意的!

  1. int i = 4;
  2. 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--也没有制约关系。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注