C 中赋值语句的求值顺序
在给定的代码片段中:
map< int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>
看似违反直觉的输出“0 1”是由于赋值中子表达式的求值顺序未指定而产生的。
根据 C 标准,赋值语句中的求值顺序是未定义的。 但是,行为如下:
因此,在代码片段中,mp.size() 被评估为 0 并分配给 mp[10]。然后,再次计算 mp[10],它现在返回分配给它的值 (1)。
尽管当前 C 标准中未指定,但此行为已在最近的提案中得到解决( N4228):
N4228 建议细化评估规则的顺序,以使其针对某些情况(包括上述情况)进行明确定义。根据该提案,赋值的右操作数在左操作数之前排序。
这意味着在 C 17 及更高版本中,代码片段的行为可能会被明确定义并导致输出“1 1。”
以上是C 赋值语句中的求值顺序如何影响输出?的详细内容。更多信息请关注PHP中文网其他相关文章!