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

标签 c++ operators operator-precedence

我正在阅读“C++ 入门(第 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() 之前被评估,因为它不知道它在哪个对象上工作,但是这似乎不一定是这种情况。

最佳答案

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

x = foo().bar();

操作顺序是

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

考虑所有相关运算符的相对优先级和结合性。不过,没有人以这种方式编写代码。

同样,给定

cin.get().get()

操作顺序是

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

,所以是的,优先规则导致首先评估 cin.get() 子表达式,产生第二个 . 的对象(然后表达式的其余部分)被应用。

关于c++ - C++中的点运算符评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26405704/

相关文章:

c++ - FCGI_SetExitStatus 不起作用

mysql - MySql not 运算符的令人惊讶的行为

java - 为什么 i += i + a[i++] + a[i++] + a[i++] 结果是 8?

javascript - Math.floor(Math.random() * 5 + 1) 的操作顺序?

c++ - 意外的 DO-WHILE 行为 : Is it ignoring the expression?

c++ - 通过与输入相同的boost图创建无向图

c++ - 重载新运算符

c - C中后缀和前缀之间括号的优先级

C 运算符——给出两个不同的结果

c++ - 为什么 const_cast<iterator>(const_iterator) 在 Visual C++ 6.0 中有效,但在 Visual Studio .NET 中无效?