为何优先级最高的[]未先执行?表达式ini = i + arr[i++] + arr[i++]解析
搞懂运算符优先级和求值顺序的核心区别
你这里的困惑其实是把运算符优先级和表达式求值顺序这两个概念搞混了,这可是很多开发者都会踩的经典坑!
先把这两个概念掰扯清楚:
- 运算符优先级:它管的是表达式的分组规则——也就是哪些操作数会被绑定到哪个运算符上,本质是定义表达式的“结构”,完全不控制代码的执行先后顺序。
- 求值顺序:指的是表达式中各个子表达式的计算先后顺序,这是由具体语言的规范来定义的(比如Java/C#是严格左到右,C/C++则属于未指定行为),和优先级没有直接关联。
回到你提到的表达式 ini = i + arr[i++] + arr[i++]:
- 首先,
[]的优先级确实高于+,所以这个表达式会被正确分组成:
这意味着ini = i + (arr[i++]) + (arr[i++])arr[i++]会被当作一个整体的操作数,而不会被错误地拆成(arr[i])++——这才是优先级真正发挥的作用。 - 但求值顺序是另一回事:在你的场景里,语言规范要求加法操作的左操作数先被求值,所以最左侧的
i会先被计算(此时i的值为1,还没被后面的i++修改),之后才会依次计算第二个操作数arr[i++]、第三个操作数arr[i++]。
总结一下:优先级决定表达式的“结构框架”,求值顺序决定这个框架里各个部分的计算先后,二者是完全独立的规则,别再把它们绑定在一起理解啦!
内容的提问来源于stack exchange,提问作者inqi777
相关产品推荐
相关产品推荐

