c ++中点运算符的评估顺序

时间:2014-10-16 13:27:38

标签: c++ operators operator-precedence

我正在阅读“C ++ Primer(第5版)”并且我遇到了一些我不确定我理解正确的事情。

这个例子与他们在书中给出的例子非常相似。想象一下,我们有一些返回字符串的函数(或任何具有非静态成员的类):

string some_function(par1, par2) {
     string str;
     // some code
     return str;
}

我知道您可以使用任何函数的返回值来访问其成员,即这样的内容是有效的:

auto size = some_function(arg1, arg2).size(); // or whatever member of class

但是,由于点运算符.和函数调用运算符()具有从左到右的分组和相同的优先级,因此上面的表达式应该是这样的:

(some_function(arg1, arg2)).size()

我想我到目前为止是对的?这里我不明白的是评价顺序。由于未为.运算符指定评估顺序,因此表示将首先评估some_function(arg1, arg2)size()。但是,如果它不知道它在哪个对象上工作,它怎么能首先评估size()?这意味着评估顺序应该从左到右固定,但事实并非如此。这怎么可能?

另一个例子是这样的:

 cin.get().get();

同样,似乎应该在第二个cin.get()之前评估第一个get(),因为它不知道它在哪个对象上工作,但似乎并非如此。< / p>

1 个答案:

答案 0 :(得分:0)

具有相同优先级的运算符根据它们的关联性进行评估,对于包含函数调用和元素选择运算符的运算符组,您正确地观察到它是从左到右。因此,是的,给出表达式

x = foo().bar();

操作顺序是

x = (((foo()).bar)());

考虑所涉及的所有运营商的相对优先级和相关性。但是,没有人以这种方式编写代码。

同样,给定

cin.get().get()

操作顺序是

(((cin.get)()).get)()

,是的,优先规则导致首先计算cin.get()子表达式,从而产生第二个.(以及表达式的其余部分)应用到的对象。 / p>