C++ order of evalutaion 点运算符 求值顺序

2018-04-10 15:16:32 +08:00
 rebeccaMyKid

书上看的代码:

const string *shoterString(const string &s1, const string &s2){
  return s1.size() <= s2.size() ? s1 : s2;
}

auto sz = shorterString(s1,s2).size();

之前看书上有写:

1.运算符有求值顺序,大部分都没有规定求值顺序。

2.在一条形如 f() + g()*h()+j() 的表达式中,优先级规定,g()的返回值和 h()的返回值相乘,结合律规定,f()的返回值先与 g()和 h()的乘积相加,所得结果再与 j()的返回值相加,对于这些函数的调用顺序没有明确规定。

那是不是点运算符的求值顺序是从左到右?否则,假如可能先右的话,那左边都还没求出来,怎么求.size()

在 SO 上找到一个类似的问题,但好像也没说明白,dot-operator-order-of-evaluation-in-c?

请教大佬们:D

903 次点击
所在节点    问与答
5 条回复
catror
2018-04-10 16:24:55 +08:00
函数调用和成员访问,优先级相同,结合性从左到右。[C++ 运算符优先级]( http://zh.cppreference.com/w/cpp/language/operator_precedence)
ipwx
2018-04-10 16:34:31 +08:00
给楼上点赞。

现代编程语言为了解决运算符二义性,除了基本的优先级,还有左右优先级。你可以去查语法手册。
farseeraliens
2018-04-10 23:12:59 +08:00
“那是不是点运算符的求值顺序是从左到右?”
点号不能叫运算符吧,就是一个间接寻址的过程,求值谈不上。哪怕调用对象的方法也只是穿了对象地址作为函数的隐式参数而已。而且还不能重载,更加证明了不是运算符。
rebeccaMyKid
2018-04-13 01:18:01 +08:00
@farseeraliens .是运算符

@ipwx 这个我知道


@catror 我说的是求值顺序

这个答案我也没深究了,但不是朋友们说的优先级和结合律的问题。感兴趣可以看下主题里那个 so 的链接,我也是从那里那个错误的答案里的评论去理解的。
catror
2018-04-16 17:51:28 +08:00
运算符的结合性规定了,`shorterString(s1,s2).size(); `这个表达式必须从左到右求值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/445653

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX