C 中赋值语句的求值顺序
给映射元素赋值时,例如 mp[10] = mp. size() 时,表达式的求值顺序变得至关重要。此特定表达式会产生意外结果“0 1”,这引发了有关 C 中指定的求值顺序的问题。
C 标准指定某些操作(例如函数调用)的求值顺序未指定。但是,像 = 这样的赋值运算符会在左右操作数求值之后进行排序,从而在指定的顺序中留下间隙。这种模糊性导致需要一个完善的提案。
最近的 C 标准提案 (N4228) 试图通过指定某些情况的评估顺序来解决这个问题。根据 N4228,这个特定的赋值表达式属于未指定行为的类别,其中两个操作数计算都是无序的。
根据 N4228 的修订版本 (P0145R0),现在指定了此行为。修订后的 [expr.ass] 部分指出,赋值运算符的右操作数在左操作数之前排序。因此,在给定的表达式中,将首先计算 mp.size(),然后将结果分配给 mp[10]。更新后的 C 17 标准预计会澄清此评估顺序。
总之,在某些情况下赋值语句的评估顺序仍然未指定,但最新的 C 标准提案(N4228)旨在细化这些规则。当前接受的规范 P0145R3 阐明了赋值的右操作数在左操作数之前进行计算,从而解决了给定表达式中的歧义。
以上是C 如何计算赋值语句中的右操作数和左操作数?的详细内容。更多信息请关注PHP中文网其他相关文章!