V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rebeccaMyKid
V2EX  ›  问与答

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

  •  
  •   rebeccaMyKid · 2018-04-10 15:16:32 +08:00 · 962 次点击
    这是一个创建于 2410 天前的主题,其中的信息可能已经有所发展或是发生改变。

    书上看的代码:

    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

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

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

    @ipwx 这个我知道


    @catror 我说的是求值顺序

    这个答案我也没深究了,但不是朋友们说的优先级和结合律的问题。感兴趣可以看下主题里那个 so 的链接,我也是从那里那个错误的答案里的评论去理解的。
    catror
        5
    catror  
       2018-04-16 17:51:28 +08:00
    运算符的结合性规定了,`shorterString(s1,s2).size(); `这个表达式必须从左到右求值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5482 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:41 · PVG 11:41 · LAX 19:41 · JFK 22:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.