微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以在一种情况下使用 map::find 和 iterator::second

如何解决可以在一种情况下使用 map::find 和 iterator::second

我有这样一段代码

SELECT disTINCT w.W_ID,'Proc' ProcHeaderName,p.ProcNumber ProcValue,'Class' ClassHeaderName,p.Class ClassValue 
INTO #Procs
FROM proc p
LEFT JOIN (SELECT wt.W_ID,wt.TestId 
    from TestValue wt where wt.IsDeleted = 0) as wtRow on wtRow.W_ID in (SELECT ID FROM #tmp) 
LEFT JOIN TableNameHere c on c.IsDeleted = 0 and c.col_ID in (SELECT col_ID FROM tmp)
WHERE p.IsDeleted = 0 and [dbo].[GetTestIdJson](c.Json,wtRow.TestId) = wtRow.TestId
    AND p.ProcNumber + ',' + p.RNumber = JSON_VALUE(c.Json,'$.Property.Label') + ',' + JSON_VALUE(c.Json,'$.Property.Label')
GROUP BY wtRow.W_ID,p.ProcNumber,p.Class

我担心先评估哪个表达式,std::map<int,int> mp; // do something auto itor = mp.find(some_value); if (itor != mp.end() && itor->second == some_other_value) { // do something } 还是 itor != mp.end()

如果首先评估第二个(可能是因为一些编译器优化?),它可能会得到未定义的行为,因为 itor->second == some_other_value 可能为真。

我是否应该担心这个问题,以便我必须这样编码:

itor == mp.end()

解决方法

不用担心;你的代码没问题。

如果 if (a && b) 的第一个条件为假,则不评估第二个条件。

查找“短路评估”

Wikipedia 有一些信息。

,

逻辑与 - && - 表达式被从左到右计算,所以 itor != mp.end() 将被初始计算。此外,只有当两个表达式都返回真时才返回真,因此如果第一个为假,则不检查第二个。

所以第一种情况应该有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。