书上看的代码:
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
1
catror 2018-04-10 16:24:55 +08:00
函数调用和成员访问,优先级相同,结合性从左到右。[C++ 运算符优先级]( http://zh.cppreference.com/w/cpp/language/operator_precedence)
|
2
ipwx 2018-04-10 16:34:31 +08:00
给楼上点赞。
现代编程语言为了解决运算符二义性,除了基本的优先级,还有左右优先级。你可以去查语法手册。 |
3
farseeraliens 2018-04-10 23:12:59 +08:00 via iPhone
“那是不是点运算符的求值顺序是从左到右?”
点号不能叫运算符吧,就是一个间接寻址的过程,求值谈不上。哪怕调用对象的方法也只是穿了对象地址作为函数的隐式参数而已。而且还不能重载,更加证明了不是运算符。 |
4
rebeccaMyKid OP @farseeraliens .是运算符
@ipwx 这个我知道 @catror 我说的是求值顺序 这个答案我也没深究了,但不是朋友们说的优先级和结合律的问题。感兴趣可以看下主题里那个 so 的链接,我也是从那里那个错误的答案里的评论去理解的。 |
5
catror 2018-04-16 17:51:28 +08:00
运算符的结合性规定了,`shorterString(s1,s2).size(); `这个表达式必须从左到右求值
|